// SPDX-License-Identifier: AGPL-3.0-or-later
package preservation;

/** Direct Java port of the selected US SDK ratan2 lookup arithmetic.
 * Table words are registered from the disc, not generated with floating-point
 * atan. Agunea offsets are signed16 differences, safely inside the original
 * domain. The INT_MIN absolute-value overflow outside that domain is rejected.
 * No processor/SDK instruction execution occurs.
 */
public final class AguneaMath {
    private AguneaMath() {}
    static boolean valid(int[] table) {
        if(table==null||table.length!=1025||table[0]!=0||table[1024]!=512)return false;
        for(int i=0;i<table.length;i++)if(table[i]<0||table[i]>512||i>0&&table[i]<table[i-1])return false;
        return true;
    }
    static int atan2(int y,int x,int[] table) {
        if(x==Integer.MIN_VALUE||y==Integer.MIN_VALUE)throw new IllegalArgumentException("Outside selected SDK atan domain");
        boolean negativeX=x<0,negativeY=y<0;
        int ax=negativeX?-x:x,ay=negativeY?-y:y;
        if(ax==0&&ay==0)return 0;
        int lookup,result;
        if(ay<ax){lookup=(ay&0x7FE00000)!=0?ay/(ax>>10):(ay<<10)/ax;result=table[lookup];}
        else{lookup=(ax&0x7FE00000)!=0?ax/(ay>>10):(ax<<10)/ay;result=1024-table[lookup];}
        if(negativeX)result=2048-result;
        if(negativeY)result=-result;
        return result;
    }
}
