/*
 * blanco Framework
 * Copyright (C) 2004-2006 IGA Tosiki
 * 
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
 * version 2.1 of the License, or (at your option) any later version.
 */
package blanco.cg.util;

import blanco.cg.BlancoCgSupportedLang;
import blanco.commons.util.BlancoStringUtil;

/**
 * blancoCgのステートメントに関するユーティリティです。
 * 
 * このクラスはプログラミング言語を超えて利用されます。<br>
 * 
 * @author IGA Tosiki
 */
class BlancoCgStatementUtil {
    /**
     * if文の開始部分の文字列を取得します。
     * 
     * @param argTargetLang
     *            出力する対象プログラミング言語。
     * @param argExpr
     *            表現。
     * @return
     */
    public static final String getIfBegin(final int argTargetLang,
            final String argExpr) {
        switch (argTargetLang) {
        case BlancoCgSupportedLang.JAVA:
        case BlancoCgSupportedLang.CS:
        case BlancoCgSupportedLang.JS:
        case BlancoCgSupportedLang.PHP:
            return "if (" + argExpr + ") {";
        case BlancoCgSupportedLang.VB:
            return "If (" + argExpr + ") Then";
        default:
            throw new IllegalArgumentException(
                    "BlancoCgStatementUtil: サポートしないプログラミング言語(" + argTargetLang
                            + ")が与えられました。");
        }
    }

    /**
     * if文の終了部分の文字列を取得します。
     * 
     * @param argTargetLang
     *            出力する対象プログラミング言語。
     * @return
     */
    public static final String getIfEnd(final int argTargetLang) {
        switch (argTargetLang) {
        case BlancoCgSupportedLang.JAVA:
        case BlancoCgSupportedLang.CS:
        case BlancoCgSupportedLang.JS:
        case BlancoCgSupportedLang.PHP:
            return "}";
        case BlancoCgSupportedLang.VB:
            return "End If";
        default:
            throw new IllegalArgumentException(
                    "BlancoCgStatementUtil: サポートしないプログラミング言語(" + argTargetLang
                            + ")が与えられました。");
        }
    }

    /**
     * for文の開始部分の文字列を取得します。Java風の文字列を戻します。
     * 
     * @param argTargetLang
     *            出力する対象プログラミング言語。
     * @param argExpr1
     *            初期化処理。
     * @param argExpr2
     *            継続条件。
     * @param argExpr3
     *            ループのつど実施する処理。
     * @return
     */
    public static final String getForBeginJava(final int argTargetLang,
            final String argExpr1, final String argExpr2, final String argExpr3) {
        switch (argTargetLang) {
        case BlancoCgSupportedLang.JAVA:
        case BlancoCgSupportedLang.CS:
        case BlancoCgSupportedLang.JS:
        case BlancoCgSupportedLang.PHP:
            return "for (" + argExpr1 + "; " + argExpr2 + "; " + argExpr3
                    + ") {";
        default:
            throw new IllegalArgumentException(
                    "BlancoCgStatementUtil.getForBeginJava: サポートしないプログラミング言語("
                            + argTargetLang + ")が与えられました。");
        }
    }

    /**
     * for文の開始部分の文字列を取得します。VB.NET風の文字列を戻します。
     * 
     * @param argTargetLang
     *            出力する対象プログラミング言語。
     * @param argCounter
     *            表現。「例: i As Integer = 1」
     * @param argTo
     *            終了となるしきい値 (条件ではありません)。「例: 10」
     * @param argStep
     *            Stepに利用される値。「例: 2」。nullの場合には Stepは省略されます。
     * @return
     */
    public static final String getForBeginVb(final int argTargetLang,
            final String argCounter, final String argTo, final String argStep) {
        switch (argTargetLang) {
        case BlancoCgSupportedLang.VB:
            break;
        default:
            throw new IllegalArgumentException(
                    "BlancoCgStatementUtil.getForBeginVb: サポートしないプログラミング言語("
                            + argTargetLang + ")が与えられました。");
        }

        String argLine = "For " + argCounter + " To " + argTo;
        if (BlancoStringUtil.null2Blank(argStep).length() > 0) {
            argLine += " Step " + argStep;
        }

        return argLine;
    }

    /**
     * for文の終了部分の文字列を取得します。
     * 
     * @param argTargetLang
     *            出力する対象プログラミング言語。
     * @return
     */
    public static final String getForEnd(final int argTargetLang) {
        switch (argTargetLang) {
        case BlancoCgSupportedLang.JAVA:
        case BlancoCgSupportedLang.CS:
        case BlancoCgSupportedLang.JS:
        case BlancoCgSupportedLang.PHP:
            return "}";
        case BlancoCgSupportedLang.VB:
            // ループ変数は省略します。
            return "Next";
        default:
            throw new IllegalArgumentException(
                    "BlancoCgStatementUtil: サポートしないプログラミング言語(" + argTargetLang
                            + ")が与えられました。");
        }
    }

    /**
     * for文を抜けるための文字列を取得します。
     * 
     * @param argTargetLang
     *            出力する対象プログラミング言語。
     * @return breakまたは Exit Forが戻ります。
     */
    public static final String getForExit(final int argTargetLang) {
        switch (argTargetLang) {
        case BlancoCgSupportedLang.JAVA:
        case BlancoCgSupportedLang.CS:
        case BlancoCgSupportedLang.JS:
        case BlancoCgSupportedLang.PHP:
            return "break";
        case BlancoCgSupportedLang.VB:
            return "Exit For";
        default:
            throw new IllegalArgumentException(
                    "BlancoCgStatementUtil: サポートしないプログラミング言語(" + argTargetLang
                            + ")が与えられました。");
        }
    }

    /**
     * 文の終わりを示す文字(多くの場合セミコロン)を取得します。
     * 
     * @param argTargetLang
     *            出力する対象プログラミング言語。
     * @return セミコロンまたは長さ0の文字列を戻します。
     */
    public static final String getTerminator(final int argTargetLang) {
        switch (argTargetLang) {
        case BlancoCgSupportedLang.JAVA:
        case BlancoCgSupportedLang.CS:
        case BlancoCgSupportedLang.JS:
        case BlancoCgSupportedLang.PHP:
            return ";";
        case BlancoCgSupportedLang.VB:
            return "";
        default:
            throw new IllegalArgumentException(
                    "BlancoCgStatementUtil: サポートしないプログラミング言語(" + argTargetLang
                            + ")が与えられました。");
        }
    }

    /**
     * return文の文字列を取得します。
     * 
     * @param argTargetLang
     *            出力する対象プログラミング言語。
     * @param argExpr
     *            値。
     * @return セミコロンは含みません。
     */
    public static final String getReturn(final int argTargetLang,
            final String argExpr) {
        switch (argTargetLang) {
        case BlancoCgSupportedLang.JAVA:
        case BlancoCgSupportedLang.CS:
        case BlancoCgSupportedLang.JS:
        case BlancoCgSupportedLang.PHP:
            // 注意。セミコロンは含みません。
            return "return " + argExpr;
        case BlancoCgSupportedLang.VB:
            // ループ変数は省略します。
            return "Return " + argExpr;
        default:
            throw new IllegalArgumentException(
                    "BlancoCgStatementUtil: サポートしないプログラミング言語(" + argTargetLang
                            + ")が与えられました。");
        }
    }
}