package org.opengion.hayabusa.io;

import org.opengion.fukurou.system.HybsConst ;		// 6.1.0.0 (2014/12/26)

/**
 * JsChartData は、JsChartData の個別属性を管理しているデータ管理クラスです。
 * 
 * @version	5.9.17.2		2017/02/08
 * @author	T.OTA
 * @since	JDK7.0
 *
 */
public class JsChartData {
	private String	chartColumn			;	// ﾁｬｰﾄｶﾗﾑ
	private String	label				;	// ﾗﾍﾞﾙ
	private String	fill				;	// ﾌｨﾙ
	private String	tension				;	// 伸張
	private String	borderColor			;	// 線の色
	private String	borderWidth			;	// 線の幅
	private String	backgroundColor		;	// 背景色
	private String	pointStyle			;	// 6.8.5.0 (2018/01/09) 点のスタイル
	private String	pointRadius			;	// 6.8.5.0 (2018/01/09) 点の大きさ
	private String	showLine			;	// 6.8.5.0 (2018/01/09) ラインを表示するかどうか
	private String	optionAttributes	;	// オプション

	/**
	 * デフォルトコンストラクター
	 *
	 * @og.rev 6.9.7.0 (2018/05/14) PMD Each class should declare at least one constructor
	 */
	public JsChartData() { super(); }		// これも、自動的に呼ばれるが、空のメソッドを作成すると警告されるので、明示的にしておきます。

	/**
	 * チャートカラムを設定します。
	 * 
	 * @param chartColumn チャートカラム
	 */
	public void setChartColumn( final String chartColumn ) {
		this.chartColumn = chartColumn;
	}

	/**
	 * JsChartData オブジェクトを作成する時のチャートカラムを取得します。
	 * 
	 * @return チャートカラム
	 */
	public String getChartColumn() {
		return chartColumn;
	}

	/**
	 * ラベルを設定します。
	 * 
	 * @param label ラベル
	 */
	public void setLabel( final String label ) {
		this.label = label;
	}

	/**
	 * ラベルを取得します。
	 * 
	 * @return ラベル
	 */
	public String getLabel() {
		return label;
	}

	/**
	 * フィル を設定します。
	 * @param fill フィル
	 */
	public void setFill( final String fill ) {
		this.fill = fill;
	}

	/**
	 * 線の伸張 を設定します。
	 * 
	 * @param tension 線の伸張
	 */
	public void setTension( final String tension ) {
		this.tension = tension;
	}

	/**
	 * 線の色 を設定します。
	 * 
	 * @param borderColor 線の色
	 */
	public void setBorderColor( final String borderColor ) {
		this.borderColor = borderColor;
	}

	/**
	 * 線の幅 を設定します。
	 * 
	 * @param borderWidth 線の幅
	 */
	public void setBorderWidth( final String borderWidth ) {
		this.borderWidth = borderWidth;
	}

	/**
	 * 背景色 を設定します。
	 * 
	 * @param backgroundColor 背景色
	 */
	public void setBackgroundColor( final String backgroundColor ) {
		this.backgroundColor = backgroundColor;
	}

	/**
	 * 点のスタイルを指定します。
	 *
	 * jsChartTag で、usePointStyle = "true" をセットした場合に有効になります。
	 * 点のスタイルは、circle,triangle,rect,rectRot,cross,crossRot,star,line,dash が、
	 * 
	 * @og.rev 6.8.5.0 (2018/01/09) 新規追加
	 * 
	 * @param ptStyle 点のスタイルを指定します。
	 */
	public void setPointStyle( final String ptStyle ) {
		pointStyle = ptStyle;
	}

	/**
	 * 点の大きさを指定します。
	 *
	 * jsChartTag で、usePointStyle = "true" をセットした場合に有効になります。
	 * 
	 * @og.rev 6.8.5.0 (2018/01/09) 新規追加
	 * 
	 * @param ptRadius 点の大きさを指定します。
	 */
	public void setPointRadius( final String ptRadius ) {
		pointRadius = ptRadius;
	}

	/**
	 * ラインを表示するかどうか[true/false]を指定します(初期値:null)。
	 *
	 * jsChartTag で、usePointStyle = "true" をセットした場合に有効になります。
	 * 初期値(null)は、showLine 属性を設定しませんが、chartJS 自体の初期値が true
	 * なので、表示されます。
	 * 
	 * @og.rev 6.8.5.0 (2018/01/09) 新規追加
	 * 
	 * @param show ラインを表示するかどうか[true/false]
	 */
	public void setShowLine( final String show ) {
		showLine = show;
	}

	/**
	 * オプション情報 を設定します。
	 * 
	 * @param optionAttributes オプション情報
	 */
	public void setOptionAttributes( final String optionAttributes ) {
		this.optionAttributes = optionAttributes;
	}

	/**
	 * JsChartData オブジェクトを作成する時のオプション情報を取得します。
	 * 
	 * @return オプション情報
	 */
	public String getOptionAttributes() {
		return optionAttributes;
	}

	/**
	 * JsChartData オブジェクトを作成するときのパラメータ情報を取得します。
	 * chartColumnとoptionAttributesを使用して、
	 * パラメータ情報を作成します。 
	 * 
	 * @return ﾊﾟﾗﾒｰﾀ文字列
	 */
	public String getParameter() {
		final StringBuilder rtn = new StringBuilder( HybsConst.BUFFER_SMALL );
		rtn.append( '{' );
		if( label != null && label.length() > 0 ) {
			rtn.append( "label:'" ).append( label ).append( "'," );
		}
		rtn.append( "data:" ).append( chartColumn );
		setProp( rtn, ",fill:"				, fill								);
		setProp( rtn, ",tension:"			, tension							);
		setProp( rtn, ",borderColor:"		, setParaOrArray( borderColor )		);
		setProp( rtn, ",borderWidth:"		, borderWidth						);
		setProp( rtn, ",backgroundColor:"	, setParaOrArray( backgroundColor )	);
		setProp( rtn, ",pointStyle:"		, setParaOrArray( pointStyle )		);
		setProp( rtn, ",pointRadius:"		, pointRadius						);
		setProp( rtn, ",showLine:"			, showLine							);
		setProp( rtn, ","					, optionAttributes					);
		rtn.append( '}' );

		return rtn.toString();
	}

	/**
	 * 配列が指定される事がある場合の、値設定。
	 * 
	 * @param str 引数(配列形式もありえる)
	 * @return ﾊﾟﾗﾒｰﾀ文字
	 */
	private String setParaOrArray( final String str ) {
		final StringBuilder sb = new StringBuilder( HybsConst.BUFFER_MIDDLE );

		// 引数が配列形式の記載であるかを判定。(頭文字が「[」であるかどうか)
		if( str != null && str.length() > 0 && !"[".equals( str.substring( 0, 1 ) ) ) {
			// 配列でない場合は、ｼﾝｸﾞﾙｸｫﾃｰｼｮﾝを付与
			sb.append( '\'' ).append( str ).append( '\'' );
		} else {
			// 配列の場合はそのまま
			sb.append( str );
		}

		return sb.toString();
	}

	/**
	 * ﾌﾟﾛﾊﾟﾃｨ設定用ﾒｿｯﾄﾞ。
	 * 
	 * setに値が存在する場合,
	 * sbにstr + setの形で値を追加する。
	 * 
	 * @param sb	ベースとなるStringBuilder
	 * @param str	文字列１
	 * @param set	文字列２
	 */
	private void setProp( final StringBuilder sb, final String str, final String set ) {
		if( set != null && set.length() > 0 ) {
			sb.append( str ).append( set );
		}
	}
}
