import java.util.Vector;

/**
 * GameInformation クラスは対局情報を保持します。
 */
public class GameInformation{
 
    private String blackPlayer;
    private String whitePlayer;
    private String blackRank;
    private String whiteRank;
    private String event;
    private String gameName;
    private String date;
    private String timeLimit;
    private String komi;
    private String rule;
    private String result;
    private String place;
    private String gameComment;
    private String size;

    /** 
      * 空のインスタンスを生成します。
      */
    public GameInformation(){ 
        blackPlayer="";
        whitePlayer="";
        blackRank="";
        whiteRank="";
        event="";
        gameName="";
        date="";
        timeLimit="";
        komi="";
        rule="";
        result="";
        place="";
        gameComment="";
        size="";
    }

    /** 
     * 対局情報を編集するときに呼び出します。SGF形式のデータツリーから、対局情報のみ抽出して保持します。
     * @param  vector  SGF形式データ
     */
    public void editGameInformation(Vector vector){
        String gameInfo="";
        for(int i=0;i<vector.size();i++){
            if(vector.get(i) instanceof String){
                String str=(String)vector.get(i);
                if(str.startsWith("B[")==false && str.startsWith("W[")==false){
                    gameInfo=str;
                    break;
                }
            }
        }
        editPlayer(gameInfo);
        editEvent(gameInfo);
        editGameName(gameInfo);
        editDate(gameInfo);
        editTimeLimit(gameInfo);
        editKomi(gameInfo);
        editRule(gameInfo);
        editResult(gameInfo);
        editPlace(gameInfo);
        editGameComment(gameInfo);
        editSize(gameInfo);
    }

    /** 
     *  対局情報を取得します。 
     *  @return  対局情報をSGF形式に変換したString
     */
    public String getSgfGameInformation(){

        String sgfGameInformation=new String(editSgfBlackPlayer(blackPlayer) + 
                                             editSgfWhitePlayer(whitePlayer) +
                                             editSgfBlackRank(blackRank)     +
                                             editSgfWhiteRank(whiteRank)     +
                                             editSgfEvent(event)             +
                                             editSgfGameName(gameName)       +
                                             editSgfDate(date)               +
                                             editSgfTimeLimit(timeLimit)     +
                                             editSgfKomi(komi)               +
                                             editSgfRule(rule)               +
                                             editSgfResult(result)           +
                                             editSgfPlace(place)             +
                                             editSgfGameComment(gameComment) +
                                             editSgfSize(size));
        return sgfGameInformation;
    
    }

    /**
     *  黒番の対局者名を設定します。 
     *  @param str  黒番の対局者名を表すString
     */
    public void setBlackPlayer(String str){
        blackPlayer=str;
    }

    /**
     *  黒番の対局者名を取得します。 
     *  @return  黒番の対局者名を表すString
     */
    public String getBlackPlayer(){
        return blackPlayer;
    }

    /**
     *  白番の対局者名を設定します。 
     *  @param str  白番の対局者名を表すString
     */
    public void setWhitePlayer(String str){
        whitePlayer=str;
    }

    /**
     *  白番の対局者名を取得します。 
     *  @return  白番の対局者名を表すString
     */
    public String getWhitePlayer(){
        return whitePlayer;
    }

    /**
     *  黒番の段位を設定します。 
     *  @param str  黒番の段位を表すString
     */
    public void setBlackRank(String str){
        blackRank=str;
    }

    /**
     *  黒番の段位を取得する。 
     *  @return  黒番の段位を表すString
     */
    public String getBlackRank(){
        return blackRank;
    }

    /**
     *  白番の段位を設定します。 
     *  @param str  白番の段位を表すString
     */
    public void setWhiteRank(String str){
        whiteRank=str;
    }

    /**
     *  白番の段位を取得します。 
     *  @return  白番の段位を表すString
     */
    public String getWhiteRank(){
        return whiteRank;
    }

    /**
     *  大会名を設定します。 
     *  @param str  大会名を表すString
     */
    public void setEvent(String str){
        event=str;
    }

    /**
     *  大会名を取得します。 
     *  @return  大会名を表すString
     */
    public String getEvent(){
        return event;
    }

    /**
     *  対局名を設定します。 
     *  @param str  対局名を表すString
     */
    public void setGameName(String str){
        gameName=str;
    }

    /**
     *  対局名を取得します。 
     *  @return  対局名を表すString
     */
    public String getGameName(){
        return gameName;
    }

    /**
     *  対局日を設定します。 
     *  @param str  対局日を表すString
     */
    public void setDate(String str){
        date=str;
    }

    /**
     *  対局日を取得します。 
     *  @return  対局日を表すString
     */
    public String getDate(){
        return date;
    }

    /**
     *  持ち時間を設定します。 
     *  @param str  持ち時間を表すString
     */
    public void setTimeLimit(String str){
        timeLimit=str;
    }

    /**
     *  持ち時間を取得します。 
     *  @return  持ち時間を表すString
     */
    public String getTimeLimit(){
        return timeLimit;
    }

    /**
     *  コミを設定します。 
     *  @param str  コミを表すString
     */
    public void setKomi(String str){
        komi=str;
    }

    /**
     *  コミを取得します。 
     *  @return  コミを表すString
     */
    public String getKomi(){
        return komi;
    }

    /**
     *  ルールを設定します。 
     *  @param str  ルールを表すString
     */
    public void setRule(String str){
        rule=str;
    }

    /**
     *  ルールを取得します。 
     *  @return  ルールを表すString
     */
    public String getRule(){
        return rule;
    }

    /**
     *  結果を設定します。 
     *  @param str  結果を表すString
     */
    public void setResult(String str){
        result=str;
    }

    /**
     *  結果を取得します。 
     *  @return  結果を表すString
     */
    public String getResult(){
        return result;
    }

    /**
     *  対局場所を設定します。 
     *  @param str  対局場所を表すString
     */
    public void setPlace(String str){
        place=str;
    }

    /**
     *  対局場所を取得します。 
     *  @return  対局場所を表すString
     */
    public String getPlace(){
        return place;
    }

    /**
     *  対局コメントを設定します。 
     *  @param str  対局コメントを表すString
     */
    public void setGameComment(String str){
        gameComment=str;
    }

    /**
     *  対局コメントを取得します。 
     *  @return  対局コメントを表すString
     */
    public String getGameComment(){
        return gameComment;
    }

    /**
     *  路数を設定します。 
     *  @param str  路数を表すString
     */
    public void setSize(String str){
        size=str;
    }

    /**
     *  路数を取得します。 
     *  @return  路数を表すString
     */
    public String getSize(){
        return size;
    }

    //------------------------------------------------------------------------
    private void editPlayer(String str){
        int startIx=str.indexOf("PB[");
        if(startIx!=-1){
            int endIx=str.indexOf("]",startIx);
            if(endIx!=-1){
                blackPlayer=str.substring(startIx+3,endIx);
            }
        }
        startIx=str.indexOf("PW[");
        if(startIx!=-1){
            int endIx=str.indexOf("]",startIx);
            if(endIx!=-1){
                whitePlayer=str.substring(startIx+3,endIx);
            }
        }
        startIx=str.indexOf("BR[");
        if(startIx!=-1){
            int endIx=str.indexOf("]",startIx);
            if(endIx!=-1){
                blackRank=str.substring(startIx+3,endIx);
            }
        }
        startIx=str.indexOf("WR[");
        if(startIx!=-1){
            int endIx=str.indexOf("]",startIx);
            if(endIx!=-1){
                whiteRank=str.substring(startIx+3,endIx);
            }
        }
    }

    //------------------------------------------------------------------------
    private void editEvent(String str){
        int startIx=str.indexOf("EV[");
        if(startIx!=-1){
            int endIx=str.indexOf("]",startIx);
            if(endIx!=-1){
                event=str.substring(startIx+3,endIx);
            }
        }
    }

    //------------------------------------------------------------------------
    private void editGameName(String str){
        int startIx=str.indexOf("GN[");
        if(startIx!=-1){
            int endIx=str.indexOf("]",startIx);
            if(endIx!=-1){
                gameName=str.substring(startIx+3,endIx);
            }
        }
    }

    //------------------------------------------------------------------------
    private void editDate(String str){
        int startIx=str.indexOf("DT[");
        if(startIx!=-1){
            int endIx=str.indexOf("]",startIx);
            if(endIx!=-1){
                date=str.substring(startIx+3,endIx);
            }
        }
    }

    //------------------------------------------------------------------------
    private void editTimeLimit(String str){
        int startIx=str.indexOf("TM[");
        if(startIx!=-1){
            int endIx=str.indexOf("]",startIx);
            if(endIx!=-1){
                timeLimit=str.substring(startIx+3,endIx);
            }
        }
    }

    //------------------------------------------------------------------------
    private void editKomi(String str){
        int startIx=str.indexOf("KM[");
        if(startIx!=-1){
            int endIx=str.indexOf("]",startIx);
            if(endIx!=-1){
                komi=str.substring(startIx+3,endIx);
            }
        }
    }

    //------------------------------------------------------------------------
    private void editRule(String str){
        int startIx=str.indexOf("RU[");
        if(startIx!=-1){
            int endIx=str.indexOf("]",startIx);
            if(endIx!=-1){
                rule=str.substring(startIx+3,endIx);
            }
        }
    }

    //------------------------------------------------------------------------
    private void editResult(String str){
        int startIx=str.indexOf("RE[");
        if(startIx!=-1){
            int endIx=str.indexOf("]",startIx);
            if(endIx!=-1){
                result=str.substring(startIx+3,endIx);
            }
        }
    }

    //------------------------------------------------------------------------
    private void editPlace(String str){
        int startIx=str.indexOf("PC[");
        if(startIx!=-1){
            int endIx=str.indexOf("]",startIx);
            if(endIx!=-1){
                place=str.substring(startIx+3,endIx);
            }
        }
    }

    //------------------------------------------------------------------------
    private void editGameComment(String str){
        int startIx=str.indexOf("GC[");
        if(startIx!=-1){
            int endIx=str.indexOf("]",startIx);
            if(endIx!=-1){
                gameComment=str.substring(startIx+3,endIx);
            }
        }
    }

    //------------------------------------------------------------------------
    private void editSize(String str){
        int startIx=str.indexOf("SZ[");
        if(startIx!=-1){
            int endIx=str.indexOf("]",startIx);
            if(endIx!=-1){
                size=str.substring(startIx+3,endIx);
            }
        }
    }

    //------------------------------------------------------------------------
    private String editSgfBlackPlayer(String str){
        return new String("PB[" + str + "]");
    }

    //------------------------------------------------------------------------
    private String editSgfWhitePlayer(String str){
        return new String("PW[" + str + "]");
    }

    //------------------------------------------------------------------------
    private String editSgfBlackRank(String str){
        return new String("BR[" + str + "]");
    }

    //------------------------------------------------------------------------
    private String editSgfWhiteRank(String str){
        return new String("WR[" + str + "]");
    }

    //------------------------------------------------------------------------
    private String editSgfEvent(String str){
        return new String("EV[" + str + "]");
    }

    //------------------------------------------------------------------------
    private String editSgfGameName(String str){
        return new String("GN[" + str + "]");
    }

    //------------------------------------------------------------------------
    private String editSgfDate(String str){
        return new String("DT[" + str + "]");
    }

    //------------------------------------------------------------------------
    private String editSgfTimeLimit(String str){
        return new String("TM[" + str + "]");
    }

    //------------------------------------------------------------------------
    private String editSgfKomi(String str){
        return new String("KM[" + str + "]");
    }

    //------------------------------------------------------------------------
    private String editSgfRule(String str){
        return new String("RU[" + str + "]");
    }

    //------------------------------------------------------------------------
    private String editSgfResult(String str){
        return new String("RE[" + str + "]");
    }

    //------------------------------------------------------------------------
    private String editSgfPlace(String str){
        return new String("PC[" + str + "]");
    }

    //------------------------------------------------------------------------
    private String editSgfGameComment(String str){
        return new String("GC[" + str + "]");
    }

    //------------------------------------------------------------------------
    private String editSgfSize(String str){
        return new String("SZ[" + str + "]");
    }

}