/**
 * IntOrder クラスは、SGF形式の手順と、OrderOfMoves クラス形式の手順の変換を行う。
 * @author Jiro Suzuki
 */
public class IntOrder{

    private OrderOfMoves orderOfMoves;

    /**
     * 手順が空のインスタンスを生成します。
     */
    IntOrder(){
        orderOfMoves=new OrderOfMoves();
    }

    /**
     * SGF形式の手順を、OrderOfMoves クラス形式の手順に変換します。
     * @param data SGF形式の手順。String の配列として受け取る。
     * @return OrderOfMoves クラス形式の手順
     */
    public OrderOfMoves translateSgfToInt(String[] data){

        //SGF形式のデータは「列行」の順番なので、行列を反転して保管する。
        for(int i=0;i<data.length;i++){
            int stoneColor,row,col;
            if(data[i].startsWith("B[") | data[i].startsWith("W[")){
                col=translateSub(data[i].charAt(2));
                row=translateSub(data[i].charAt(3));
                if(data[i].startsWith("B[")){
                    stoneColor=1;
                }else{
                    stoneColor=2;
                }
                orderOfMoves.add(new Move(stoneColor,row,col));
            }
        }
        return orderOfMoves;
    }

    private int translateSub(char ch){
        int i=0;
        switch (ch){
            case 'a':i=0; break;
            case 'b':i=1; break;
            case 'c':i=2; break;
            case 'd':i=3; break;
            case 'e':i=4; break;
            case 'f':i=5; break;
            case 'g':i=6; break;
            case 'h':i=7; break;
            case 'i':i=8; break;
            case 'j':i=9; break;
            case 'k':i=10; break;
            case 'l':i=11; break;
            case 'm':i=12; break;
            case 'n':i=13; break;
            case 'o':i=14; break;
            case 'p':i=15; break;
            case 'q':i=16; break;
            case 'r':i=17; break;
            case 's':i=18; break;
            case 't':i=-1; break;
            default:i=-1; break;
        }
        return i;
    }

    /**
     * OrderOfMoves クラス形式の手順を、SGF形式の手順に変換します。
     * @param orderOfMoves OrderOfMoves クラス形式の手順。
     * @return SGF形式の手順。String の配列として渡す。
     */
    public String[] translateIntToSgf(OrderOfMoves orderOfMoves){

        //SGF形式のデータは「列行」の順番なので、行列を反転して保管する。
        String[] sgfStrArray=new String[orderOfMoves.size()];
        for(int i=0;i<orderOfMoves.size();i++){
            String stoneColor,row,col;
            col=translateSub2(orderOfMoves.get(i).getCol());
            row=translateSub2(orderOfMoves.get(i).getRow());
            if(orderOfMoves.get(i).getStoneColor()==1){
                stoneColor="B[";
            }else{
                stoneColor="W[";
            }
            String sgfMove=new String(stoneColor + col + row + "]");
            sgfStrArray[i]=sgfMove;
        }
        return sgfStrArray;
    }

    private String translateSub2(int num){
        String s;
        switch (num){
            case  0:s="a"; break;
            case  1:s="b"; break;
            case  2:s="c"; break;
            case  3:s="d"; break;
            case  4:s="e"; break;
            case  5:s="f"; break;
            case  6:s="g"; break;
            case  7:s="h"; break;
            case  8:s="i"; break;
            case  9:s="j"; break;
            case 10:s="k"; break;
            case 11:s="l"; break;
            case 12:s="m"; break;
            case 13:s="n"; break;
            case 14:s="o"; break;
            case 15:s="p"; break;
            case 16:s="q"; break;
            case 17:s="r"; break;
            case 18:s="s"; break;
            default:s="t"; break;
        }
        return s;
    }
}