/*
 * Copyright (c) 2009 The openGion Project.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,
 * either express or implied. See the License for the specific language
 * governing permissions and limitations under the License.
 */
package org.opengion.plugin.view;

import org.opengion.hayabusa.db.DBColumn;
import org.opengion.hayabusa.db.DBColumnConfig;
import org.opengion.hayabusa.db.DBTableModel;
import org.opengion.hayabusa.resource.ResourceFactory;
import org.opengion.hayabusa.resource.ResourceManager;
import org.opengion.hayabusa.resource.LabelData;
import org.opengion.hayabusa.common.HybsSystemException;

/**
 * 指定の行-列と、動的ｶﾗﾑのﾃｰﾌﾞﾙを作成するクラスです。
 *
 * AbstractViewForm により、setter/getterメソッドのデフォルト実装を提供しています。
 * 各HTMLのタグに必要な setter/getterメソッドのみ，追加定義しています。
 *
 * RENDERER,EDITOR,DBTYPE を使用する代わりに、簡易的な DATA_TYPE で決定します。
 *
 * ﾃﾞｰﾀ作成には、ﾄｰｸﾝ(TOKEN) , ﾃﾞｰﾀ型(DATA_TYPE) , 表示桁数(VIEW_LEN) , 行番号(ROWNO) , 列番号(COLNO) , 列数(COLSPAN) , 行数(ROWSPAN) が必要です。
 *
 * @og.group 画面表示
 *
 * @version  7.3
 * @author   Kazuhiko Hasegawa
 * @since    JDK11.0,
 */
public class ViewForm_HTMLTokenTable extends ViewForm_HTMLTable {
	/** このプログラムのVERSION文字列を設定します。	{@value} */
	private static final String VERSION = "7.3.2.1 (2021/03/25)" ;

	private int noToken		= -1;
	private int noVal		= -1;
	private int noName		= -1;
	private int noType		= -1;
	private int noVlen		= -1;
	private int noRowno		= -1;
	private int noColno		= -1;
	private int noColspan	= -1;
	private int noRowspan	= -1;

	/**
	 * デフォルトコンストラクター
	 *
	 * @og.rev 7.3.2.1 (2021/03/25) 動的ｶﾗﾑのﾃｰﾌﾞﾙを作成する
	 */
	public ViewForm_HTMLTokenTable() { super(); }		// これも、自動的に呼ばれるが、空のメソッドを作成すると警告されるので、明示的にしておきます。

	/**
	 * 初期化します。
	 * ここでは、内部で使用されているキャッシュをクリアし、
	 * 新しいモデル(DBTableModel)と言語(lang) を元に内部データを再構築します。
	 * ただし、設定情報は、以前の状態がそのままキープされています。
	 *
	 * @og.rev 7.3.2.1 (2021/03/25) 動的ｶﾗﾑのﾃｰﾌﾞﾙを作成する
	 *
	 * @param	table	DBTableModelオブジェクト
	 */
	@Override
	public void init( final DBTableModel table ) {
		super.init( table );

		noToken		= table.getColumnNo( "TOKEN"		);		// 必須
		noVal		= table.getColumnNo( "VAL"		, false );	// 値
		noName		= table.getColumnNo( "TKN_NM"	, false );	// 値
		noType		= table.getColumnNo( "DATA_TYPE", false );	// ｶﾗﾑがない場合は、初期値を使用
		noVlen		= table.getColumnNo( "VIEW_LEN"	, false );	// ｶﾗﾑがない場合は、初期値を使用
		noRowno		= table.getColumnNo( "ROWNO"	, false );	// ｶﾗﾑがない場合は、初期値を使用
		noColno		= table.getColumnNo( "COLNO"	, false );	// ｶﾗﾑがない場合は、初期値を使用
		noColspan	= table.getColumnNo( "COLSPAN"	, false );	// ｶﾗﾑがない場合は、初期値を使用
		noRowspan	= table.getColumnNo( "ROWSPAN"	, false );	// ｶﾗﾑがない場合は、初期値を使用
	}

	/**
	 * DBTableModel から HTML文字列を作成して返します。
	 * startNo(表示開始位置)から、pageSize(表示件数)までのView文字列を作成します。
	 * 表示残りデータが pageSize 以下の場合は,残りのデータをすべて出力します。
	 *
	 * @og.rev 7.3.2.1 (2021/03/25) 動的ｶﾗﾑのﾃｰﾌﾞﾙを作成する
	 *
	 * @param  startNo    表示開始位置
	 * @param  pageSize   表示件数
	 *
	 * @return  DBTableModelから作成された HTML文字列
	 * @og.rtnNotNull
	 */
	@Override
	public String create( final int startNo, final int pageSize )  {
		if( getRowCount() == 0 ) { return ""; }	// 暫定処置

		final DBTableModel table = getDBTableModel() ;

		final int lastNo = getLastNo( startNo, pageSize );

		final StringBuilder out = new StringBuilder( BUFFER_LARGE )
			.append( getCountForm( startNo,pageSize ) )
			.append( getHeader() );

		final ResourceManager resource = ResourceFactory.newInstance( "ja" ) ;

		out.append("<table><tbody>").append( CR );
		int lastRow = 0;
		int bgClrCnt = 0;
		final int clmCnt = getColumnCount();
		for( int row=startNo; row<lastNo; row++ ) {
			final int rowno = noRowno < 0 ? lastRow++ : Integer.parseInt( table.getValue( row,noRowno ) );
			if( lastRow != rowno ) {
				lastRow = rowno;
				if( row != startNo ) { out.append(" </tr>").append( CR ); }	// 最初のループだけは、実行しない。

				out.append(" <tr").append( getBgColorCycleClass( bgClrCnt++,row ) ).append('>');
			}

			final String clmId = table.getValue( row,noToken );
			final String lbl   = noName < 0 ? clmId : table.getValue( row,noName );
			final String type  = noType < 0 ? clmId : table.getValue( row,noType );

			final DBColumn clm = resource.makeDBColumn( type,lbl );
			final DBColumnConfig config = clm.getConfig();
			config.setName( table.getValue( row,noToken ) );

			if( noVlen >= 0 ) { config.setViewLength( table.getValue( row,noVlen ) ); }

			final String colspan = noColspan < 0 ? "1" : table.getValue( row,noColspan );
			final String rowspan = noRowspan < 0 ? "1" : table.getValue( row,noRowspan );

			if( "1".equals( rowspan ) ) {
				out.append( "<td>" );
			}
			else {
				out.append( "<td rowspan=\"" ).append( rowspan ).append( "\">" );
			}
			out.append(lbl).append( "</td><td" );

			if( !"1".equals( colspan ) ) {
				out.append( " colspan=\"" ).append( colspan ).append( '"' );
			}

			if( !"1".equals( rowspan ) ) {
				out.append( " rowspan=\"" ).append( rowspan ).append( '"' );
			}
			out.append(">");


			final String val = noVal < 0 ? "" : table.getValue( row,noVal );
			out.append( new DBColumn( config ).getEditorValue( val ) ).append("</td>");

System.out.printf( "rowno=%d clmId=%s lbl=%s type=%s colspan=%s rowspan=%s val=%s\n" , rowno,clmId,lbl,type,colspan,rowspan,val );

		}
		out.append(" </tr></tbody>").append( CR )
			.append("</table>").append( CR )
			.append( getScrollBarEndDiv() );

		return out.toString();
	}

	/**
	 * DBTableModel から テーブルのタグ文字列を作成して返します。
	 *
	 * @return  テーブルのタグ文字列
	 * @og.rtnNotNull
	 */
	@Override
	protected String getTableHead() {
		// ヘッダーは，不要です。
		return "";
	}
}
