import ass1.*;
import java.io.IOException;


/**
 * COMMENT: Comment Ass1Dryrun 
 *
 * 
 */
public class Ass1Dryrun {

    private static final int NTESTS = 35;

    public static void main(String[] args) throws IOException {

        if (args.length > 0) {
            for (int i = 0; i < args.length; i++) {
                int test = Integer.parseInt(args[i]);
                runTest(test);
            }
        }
        else {
            for (int i = 1; i <= NTESTS; i++) {
                runTest(i);
            }
        }

    }

    private static void runTest(int test) throws IOException {

	System.out.println("Test " + test);
        switch (test) {

        case 1: {
            System.out.println("translationMatrix({2,3})");
            double[] v = new double[] { 2, 3 };
            double[][] matrix = MathUtil.translationMatrix(v);
            double[][] solution = {{1,0,2},{0,1,3},{0,0,1}};
            if(compareMatrix(matrix,solution) == false){
                System.out.println("Your output");
                printMatrix(matrix);
                System.out.println("Model output");
                printMatrix(solution);
            } else {
                System.out.println("passed!");
            }
            
            break;
        }

        case 2: {
            System.out.println("rotationMatrix(30)");
            double[][] matrix = MathUtil.rotationMatrix(30);
            double[][] solution = {{0.866,-0.5,0},{0.5,0.866,0},{0,0,1}};
            if(compareMatrix(matrix,solution) == false){
                System.out.println("Your output");   
                printMatrix(matrix);
                System.out.println("Model output");
                printMatrix(solution);
            } else {
                System.out.println("passed!");
            }
            break;
        }

        case 3: {
            System.out.println("Game Object Offset = (2,3), rotation = 30, scale = 5");
            double vals[] = {2,3,30,5,2,3,30,5};
            GameObject g = new GameObject(GameObject.ROOT);
            g.translate(2, 3);
            g.rotate(30);
            g.scale(5);
             if(compareFrame(g,vals) == false){
                System.out.println("Your output");   
                printFrame(g);
                System.out.println("Model output");
                printVals(vals);
            } else {
                System.out.println("passed!");
            }
        

            break;
        }
      
    }
}

    private static void printVals(double x[]){
        for(int i=0; i< x.length; i++){
            System.out.println(x[i]);
        }
    }

    private static boolean floatingEquals(double x1, double x2){
         double EPSILON = 0.001;
         double diff = Math.abs(x1-x2);
         return diff < EPSILON;
    }

    private static boolean compareMatrix(double[][] matrix,double[][] solution) {
        for (int i = 0; i < matrix.length; i++) {
            for (int j = 0; j < matrix[i].length; j++) {
                if(floatingEquals(matrix[i][j],solution[i][j]) == false)    
			return false;
            }
            
        }
        return true;
    }


    private static void printMatrix(double[][] matrix) {
        for (int i = 0; i < matrix.length; i++) {
            for (int j = 0; j < matrix[i].length; j++) {
                System.out.print(matrix[i][j]);
                System.out.print("\t");
            }
            System.out.println();
        }
    }

    private static boolean compareFrame(GameObject g, double vals[]) {
        int counter = 0;
        boolean eq = true;
        double[] position = g.getPosition();
        eq &= floatingEquals(position[0],vals[counter++]);
        eq &= floatingEquals(position[1],vals[counter++]);

        double rotation = g.getRotation();
        eq &= floatingEquals(rotation,vals[counter++]);
        double scale = g.getScale(); 
        eq &= floatingEquals(scale,vals[counter++]);

        position = g.getGlobalPosition();
        eq &= floatingEquals(position[0],vals[counter++]);
        eq &= floatingEquals(position[1],vals[counter++]);
        rotation = g.getGlobalRotation();
        eq &= floatingEquals(rotation,vals[counter++]);
        scale = g.getGlobalScale();
        eq &= floatingEquals(scale,vals[counter++]);

        return eq;
    }

    private static void printFrame(GameObject g) {

        double[] position = g.getPosition();
        double rotation = g.getRotation();
        double scale = g.getScale();

        System.out.format("local position = %g\t%g\n", position[0], position[1]);
        System.out.format("local rotation = %g\n", rotation);
        System.out.format("local scale = %g\n", scale);

        position = g.getGlobalPosition();
        rotation = g.getGlobalRotation();
        scale = g.getGlobalScale();

        System.out.format("global position = %g\t%g\n", position[0],
            position[1]);
        System.out.format("global rotation = %g\n", rotation);
        System.out.format("global scale = %g\n", scale);
    }

}
