import java.io.*;
import java.util.*;

/**
 * SgfReader クラスは、SGF形式の棋譜情報を、囲碁Viewer形式の棋譜情報に変換します。
 * @author Jiro Suzuki
 */
public class SgfReader{

    private Kifu kifu;
    private Vector sgfVectorTree;

    /**
     * 棋譜情報が空のインスタンスを生成します。
     */
    SgfReader(){
        kifu=new Kifu();
        sgfVectorTree=new Vector();
    }

    /**
     * SGF形式で作成された棋譜情報ファイルを読み込み、囲碁Viewer形式の棋譜情報に変換します。
     * @param fileName SGF形式の棋譜ファイル名。フルパス指定で渡す。
     * @return 囲碁Viewer形式の棋譜情報。Kifuクラス形式。
     */
    public Kifu read(String fileName){
        String strAll="";
        try{
            String line;
            BufferedReader br=new BufferedReader(new FileReader(fileName));
            while((line=br.readLine()) != null ) {
                strAll=strAll.concat(line);
            }
        }
        catch(IOException e){
            System.out.print("Error:"+e);
            System.exit(1);
        }

        //SgfTree取得
        //ここで、SGF形式のデータ(String)から手順部分のデータツリーをVector形式で取得する。
        SgfTree sgfTree=new SgfTree();
        sgfVectorTree=sgfTree.getSgfTree(strAll);

        //本手順取得
        //ここで、Vector形式の手順を、囲碁Viewer形式の手順に変換し、同時に参考図情報を取り除く。
        SgfOrder sgfOrder=new SgfOrder();
        String[] strOrder=sgfOrder.includeOrder(sgfVectorTree);
        IntOrder intOrder=new IntOrder();
        OrderOfMoves orderOfMoves=intOrder.translateSgfToInt(strOrder);
        kifu.setOrderOfMoves(orderOfMoves);

        //ゲームインフォメーション取得
        GameInformation gi=new GameInformation();
        gi.editGameInformation(sgfVectorTree);
        kifu.setGameInformation(gi);

        return kifu;
    }

    /**
     * SGF形式の手順データツリーを返します。
     * @return SGF形式の手順データツリー。Vectorクラス形式。
     */
    public Vector getSgfTree(){
        return sgfVectorTree;
    }
}