/*
 * 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
 */
public class BlancoCgLineUtil {
    /**
     * 行コメントのプレフィックスを取得します。
     * 
     * @param argTargetLang
     *            出力する対象プログラミング言語。
     * @return 行コメントのプレフィックス。空白を含みます。
     */
    public static final String getSingleLineCommentPrefix(
            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(
                    "BlancoCgLineUtil: サポートしないプログラミング言語(" + argTargetLang
                            + ")が与えられました。");
        }
    }

    /**
     * 文字列リテラルをくくる文字を取得します。
     * 
     * @param argTargetLang
     *            出力する対象プログラミング言語。
     * @return ダブルクオートまたはシングルクオート。
     */
    public static final String getStringLiteralEnclosure(final int argTargetLang) {
        switch (argTargetLang) {
        case BlancoCgSupportedLang.JAVA:
        case BlancoCgSupportedLang.CS:
        case BlancoCgSupportedLang.JS:
        case BlancoCgSupportedLang.VB:
            return "\"";
        case BlancoCgSupportedLang.PHP:
            return "'";
        default:
            throw new IllegalArgumentException(
                    "BlancoCgLineUtil: サポートしないプログラミング言語(" + argTargetLang
                            + ")が与えられました。");
        }
    }

    /**
     * 文字列を連結する際のオペレータを取得します。
     * 
     * @param argTargetLang
     *            出力する対象プログラミング言語。
     * @return ダブルクオートまたはシングルクオート。
     */
    public static final String getStringConcatenationOperator(
            final int argTargetLang) {
        switch (argTargetLang) {
        case BlancoCgSupportedLang.JAVA:
        case BlancoCgSupportedLang.CS:
        case BlancoCgSupportedLang.JS:
        case BlancoCgSupportedLang.VB:
            return "+";
        case BlancoCgSupportedLang.PHP:
            return ".";
        default:
            throw new IllegalArgumentException(
                    "BlancoCgLineUtil: サポートしないプログラミング言語(" + argTargetLang
                            + ")が与えられました。");
        }
    }

    /**
     * 変数のプレフィックスを戻します。
     * 
     * @param argTargetLang
     *            出力する対象プログラミング言語。
     * @return PHPの場合に$が戻ります。
     */
    public static final String getVariablePrefix(final int argTargetLang) {
        switch (argTargetLang) {
        case BlancoCgSupportedLang.PHP:
            return "$";
        default:
            return "";
        }
    }

    /**
     * 変数宣言を取得します。
     * 
     * @param argTargetLang
     *            出力する対象プログラミング言語。
     * @param argVariableName
     *            変数名。
     * @param argTypeShortName
     *            短い型名。
     * @param argInitialValue
     *            初期値。初期値が無い場合にはnullまたは長さ0の文字列をセット。
     * @return 変数宣言が１行戻ります。行の終端であるセミコロンは含まれません。
     */
    public static final String getVariableDeclaration(final int argTargetLang,
            final String argVariableName, final String argTypeShortName,
            final String argInitialValue) {
        String result = "";
        switch (argTargetLang) {
        case BlancoCgSupportedLang.JAVA:
        default:
            result = argTypeShortName + " " + argVariableName;
            break;
        case BlancoCgSupportedLang.CS:
            result = argTypeShortName + " " + argVariableName;
            break;
        case BlancoCgSupportedLang.JS:
            // 型名は利用しません。
            result = "var " + argVariableName;
            break;
        case BlancoCgSupportedLang.VB:
            result = "Dim " + argVariableName + " As " + argTypeShortName;
            break;
        case BlancoCgSupportedLang.PHP:
            // 型名は利用しません。
            result = BlancoCgLineUtil.getVariablePrefix(argTargetLang)
                    + argVariableName;
            break;
        }

        if (BlancoStringUtil.null2Blank(argInitialValue).length() > 0) {
            result += " = " + argInitialValue;
        }
        return result;
    }

    // ここ以降はファサードメソッド。

    /**
     * if文の開始部分の文字列を取得します。
     * 
     * @param argTargetLang
     *            出力する対象プログラミング言語。
     * @param argExpr
     *            表現。
     * @return
     */
    public static final String getIfBegin(final int argTargetLang,
            final String argExpr) {
        return BlancoCgStatementUtil.getIfBegin(argTargetLang, argExpr);
    }

    /**
     * if文の終了部分の文字列を取得します。
     * 
     * @param argTargetLang
     *            出力する対象プログラミング言語。
     * @return
     */
    public static final String getIfEnd(final int argTargetLang) {
        return BlancoCgStatementUtil.getIfEnd(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) {
        return BlancoCgStatementUtil.getForBeginJava(argTargetLang, argExpr1,
                argExpr2, argExpr3);
    }

    /**
     * for文の開始部分の文字列を取得します。VB.NET風の文字列を戻します。
     * 
     * @param argTargetLang
     *            出力する対象プログラミング言語。
     * @param argCounter
     *            表現。「例: i As Integer = 1」
     * @param argTo
     *            終了となるしきい値 (条件ではありません)。「例: 10」
     * @return
     */
    public static final String getForBeginVb(final int argTargetLang,
            final String argCounter, final String argTo) {
        return BlancoCgStatementUtil.getForBeginVb(argTargetLang, argCounter,
                argTo, null);
    }

    /**
     * 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) {
        return BlancoCgStatementUtil.getForBeginVb(argTargetLang, argCounter,
                argTo, argStep);
    }

    /**
     * for文の終了部分の文字列を取得します。
     * 
     * @param argTargetLang
     *            出力する対象プログラミング言語。
     * @return
     */
    public static final String getForEnd(final int argTargetLang) {
        return BlancoCgStatementUtil.getForEnd(argTargetLang);
    }

    /**
     * for文を抜けるための文字列を取得します。
     * 
     * @param argTargetLang
     *            出力する対象プログラミング言語。
     * @return breakまたは Exit Forが戻ります。
     */
    public static final String getForExit(final int argTargetLang) {
        return BlancoCgStatementUtil.getForExit(argTargetLang);
    }

    /**
     * 文の終わりを示す文字(多くの場合セミコロン)を取得します。
     * 
     * @param argTargetLang
     *            出力する対象プログラミング言語。
     * @return セミコロンまたは長さ0の文字列を戻します。
     */
    public static final String getTerminator(final int argTargetLang) {
        return BlancoCgStatementUtil.getTerminator(argTargetLang);
    }

    /**
     * return文の文字列を取得します。
     * 
     * @param argTargetLang
     *            出力する対象プログラミング言語。
     * @param argExpr
     *            値。
     * @return セミコロンは含みません。
     */
    public static final String getReturn(final int argTargetLang,
            final String argExpr) {
        return BlancoCgStatementUtil.getReturn(argTargetLang, argExpr);
    }
}