/*********************************************************************
* All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*   システム名      ：eo顧客基幹システム
*   モジュール名    ：DKW04606SFLogic
*   ソースファイル名：DKW04606SFLogic.java
*   作成者          ：富士通
*   日付            ：2011年05月10日
*＜機能概要＞
*   入荷登録詳細画面のビューロジックです。
*＜修正履歴＞
*   バージョン  修正日       修正者      修正内容
*   v1.00.00    2011/05/10   FJ）植木    新規作成
*   v39.00.00   2018/09/14   FJ)黒田(耕)【ANK-3488-00-00】４KSTB（ACASチップ）導入対応
*   v50.00.00   2020/08/25   FJ)謝      【ANK-3738-00-00】【eo】機器の製造年月日・ロット番号管理対応
*
**********************************************************************/
package eo.web.webview.DKW04606SF;

import static com.fujitsu.futurity.web.x31.X31SWebLog.DEBUG_LOG;

import java.util.ArrayList;
import java.util.HashMap;

import com.fujitsu.futurity.web.x31.X31CWebConst;
import com.fujitsu.futurity.web.x31.X31SDataBeanAccess;
import com.fujitsu.futurity.web.x31.X31SDataBeanAccessArray;

import eo.common.constant.JDKStrConst;
import eo.common.util.JPCUtilCommon;
import eo.web.webview.JCCWebBusinessLogic;
import eo.web.webview.CommonInfoCF.CommonInfoCFConst;
import eo.web.webview.common.JCCWebCommon;
import eo.web.webview.common.JDKScreenConst;
import eo.web.webview.common.JDKWebCommon;

/**
 * DKW04606のビューロジック
 * <BR>
 * @author 富士通
 */
public class DKW04606SFLogic extends JCCWebBusinessLogic
{

	/** シリアルバージョン */
	private static final long serialVersionUID = 2430673436604520155L;
	/**
	 * 行カラー（奇数行）
	 */
	private static final String ODD = "odd";
	/**
	 * 行カラー（偶数行）
	 */
	private static final String EVEN = "even";

	/** ページング関連（総ページ数） */
	private static final String TOTAL_PAGE_NUM = "total_page_num";
	/** ページング関連（検索エラーフラグ） */
	private static final String SEARCH_ERR_FLG = "search_err_flg";
	/** ページング関連（総検索件数） */
	private static final String TOTAL_SEARCH_NUM = "total_search_num";
	/** ページング関連（表示件数） */
	private static final String DISPLAY_NUM = "display_num";
	/** ページング関連（最大検索件数） */
	private static final String MAX_SEARCH_NUM = "max_search_num";
	/** ページング関連（検索パターン） */
	private static final String SEARCH_TYPE = "search_type";
	/** ページング関連（表示ページ番号） */
	private static final String DISPLAY_PAGE_NUM = "display_page_num";
	/** ページング関連（検索パターン：部分一致） */
	private static final String PAGING_SEARCH_TYPE = "1";
	/** 検索件数取得キー（最大検索件数） */
	private static final String DKW04606_MAX_SHOW_CNT = "DKW04606_MAX_SHOW_CNT";
	/** 検索件数取得キー（表示件数） */
	private static final String DKW04606_ROW_PER_PAGE = "DKW04606_ROW_PER_PAGE";
	/** VARB */
	private static final String L_PAG_DETAIL = "L_PAG_DETAIL";
	/** テンプレートID */
	private static final String PAGING_TEMPLATE_ID = JDKScreenConst.SCREEN_ID_DKW04606;
	/** レコード種別（明細） */
	private static final String RECORD_DETAIL = "52";

	/** ファイルレイアウト（レコード種別：52） */
	private static final String[] RECORD_LAYOUT_DETAIL = {
		DKW04606SFConst.REC_SBT_01
		, DKW04606SFConst.MODEL_CD_01
		, DKW04606SFConst.SEIZO_NO_01
		, DKW04606SFConst.TAKNKIKI_SETHIN_CD_01
		, DKW04606SFConst.TAKNKIKI_SETHIN_NO_01
		, DKW04606SFConst.UQ_NINSHO_ID_01
		, DKW04606SFConst.UQ_PWD_01
		, DKW04606SFConst.STB_ID_01
		, DKW04606SFConst.ICC_ID_01
		, DKW04606SFConst.MACAD_01
		, DKW04606SFConst.MAC_NINSHO_ID_01
		, DKW04606SFConst.MSISDN_01
		, DKW04606SFConst.EM_KEISHA_CD_01
// ANK-3488-00-00 ADD START
		, DKW04606SFConst.ACAS_NO_01
// ANK-3488-00-00 ADD END
// ANK-3738-00-00 ADD START
		, DKW04606SFConst.SEIZO_YM_01
// ANK-3738-00-00 ADD END
	};

	/**
	 * 初期表示を処理します。
	 * @author 富士通
	 * @return 成否
	 * @throws Exception 例外
	 */
	public boolean init() throws Exception
	{
		JCCWebCommon.getScreenInfo(this);

		String fileRenban = JDKWebCommon.getData(this, DKW04606SFConst.FILE_RENBAN);
		
		// データ読込した情報が存在する時だけ明細情報の設定を行う
		if (!"".equals(fileRenban))
		{
			// ページング
			JCCWebCommon.clearPageLinkInfo(this, JDKScreenConst.SCREEN_ID_DKW04606);
			pickFromLines(0);
			initializePageInformation(getAllDataCount(), JDKScreenConst.SCREEN_ID_DKW04606, L_PAG_DETAIL);
		}
		
		return true;
	}

	/**
	 * 戻るボタン押下処理を行います。
	 * @author 富士通
	 * @return 成否
	 * @throws Exception 例外
	 */
	public boolean returnCreate() throws Exception
	{
		JCCWebCommon.setScreenId(this, JDKScreenConst.SCREEN_ID_DKW04602, JDKScreenConst.SCREEN_ID_DKW04606);
		setNextScreen(JDKScreenConst.SCREEN_ID_DKW04602, JDKScreenConst.SCREEN_NAME_DKW04602);

		return true;
	}

	/**
	 * ページングを処理します。
	 * @author 富士通
	 * @return 成否
	 * @throws Exception 例外
	 */
	public boolean paging() throws Exception
	{
		pickFromLines(getDisplayPageNumber(JDKScreenConst.SCREEN_ID_DKW04606, L_PAG_DETAIL));

		setNextScreen(JDKScreenConst.SCREEN_ID_DKW04606, JDKScreenConst.SCREEN_NAME_DKW04606);

		return true;
	}

	/**
	 * 入荷情報一覧リストから指定のページデータを切り出します。
	 * @author 富士通
	 * @param page ページ
	 */
	private void pickFromLines(int page)
	{
		DEBUG_LOG.debug(String.format("%dページ目のデータを準備します。", page + 1));

		X31SDataBeanAccess bean = super.getServiceFormBean();

		ArrayList<HashMap<String, String>> detailList = getDetailList();

		X31SDataBeanAccessArray list = bean.getDataBeanArray(DKW04606SFConst.NYUKA_FIN_INFO_DTL_LIST);
		list.clearArray();

		int dataCount = detailList.size();
		String rowsPerPage = JCCWebCommon.getSearchConst(DKW04606_ROW_PER_PAGE);
		int iRowsPerPage = Integer.parseInt(rowsPerPage, 10);
		int start = page * iRowsPerPage;
		int end = (page + 1) * iRowsPerPage;
		if (dataCount < end)
		{
			end = dataCount;
		}

		DEBUG_LOG.debug(String.format("出力データ：全%d件中 %d〜%d", dataCount, start + 1, end));
		for (int i = start ; i < end ; i++)
		{
			HashMap<String, String> detailMap = detailList.get(i);

			X31SDataBeanAccess subbean = list.addDataBean();
			JDKWebCommon.setData(subbean, i + 1L, DKW04606SFConst.NO_01);
			JDKWebCommon.setData(subbean, ((i + 1) % 2 == 0) ? EVEN : ODD, DKW04606SFConst.LINE_COLOR_01);
			JDKWebCommon.setData(subbean, detailMap.get(DKW04606SFConst.REC_SBT_01), DKW04606SFConst.REC_SBT_01);
			JDKWebCommon.setData(subbean, detailMap.get(DKW04606SFConst.MODEL_CD_01), DKW04606SFConst.MODEL_CD_01);
			JDKWebCommon.setData(subbean, detailMap.get(DKW04606SFConst.SEIZO_NO_01), DKW04606SFConst.SEIZO_NO_01);
			JDKWebCommon.setData(subbean, detailMap.get(DKW04606SFConst.TAKNKIKI_SETHIN_CD_01), DKW04606SFConst.TAKNKIKI_SETHIN_CD_01);
			JDKWebCommon.setData(subbean, detailMap.get(DKW04606SFConst.TAKNKIKI_SETHIN_NO_01), DKW04606SFConst.TAKNKIKI_SETHIN_NO_01);
			JDKWebCommon.setData(subbean, detailMap.get(DKW04606SFConst.UQ_NINSHO_ID_01), DKW04606SFConst.UQ_NINSHO_ID_01);
			JDKWebCommon.setData(subbean, detailMap.get(DKW04606SFConst.UQ_PWD_01), DKW04606SFConst.UQ_PWD_01);
			JDKWebCommon.setData(subbean, detailMap.get(DKW04606SFConst.STB_ID_01), DKW04606SFConst.STB_ID_01);
			JDKWebCommon.setData(subbean, detailMap.get(DKW04606SFConst.ICC_ID_01), DKW04606SFConst.ICC_ID_01);
			JDKWebCommon.setData(subbean, detailMap.get(DKW04606SFConst.MACAD_01), DKW04606SFConst.MACAD_01);
			JDKWebCommon.setData(subbean, detailMap.get(DKW04606SFConst.MAC_NINSHO_ID_01), DKW04606SFConst.MAC_NINSHO_ID_01);
			JDKWebCommon.setData(subbean, detailMap.get(DKW04606SFConst.MSISDN_01), DKW04606SFConst.MSISDN_01);
			JDKWebCommon.setData(subbean, detailMap.get(DKW04606SFConst.EM_KEISHA_CD_01), DKW04606SFConst.EM_KEISHA_CD_01);
// ANK-3488-00-00 ADD START
			JDKWebCommon.setData(subbean, detailMap.get(DKW04606SFConst.ACAS_NO_01), DKW04606SFConst.ACAS_NO_01);
// ANK-3488-00-00 ADD END
// ANK-3738-00-00 ADD START
			JDKWebCommon.setData(subbean, detailMap.get(DKW04606SFConst.SEIZO_YM_01), DKW04606SFConst.SEIZO_YM_01);
// ANK-3738-00-00 ADD END
		}

		JDKWebCommon.setData(this, String.valueOf(end - start), DKW04606SFConst.CNT);
	}

	/**
	 * ファイル（ヘッダ、明細、トレーラ）から明細リストを返す。
	 * @return 明細リスト
	 */
	private ArrayList<HashMap<String, String>> getDetailList()
	{
		ArrayList<HashMap<String, String>> retList = new ArrayList<HashMap<String, String>>();

		String fileRenban = JDKWebCommon.getData(this, DKW04606SFConst.FILE_RENBAN);

		byte[] fileByte = JCCWebCommon.getFile(this, fileRenban);
		String str = new String(fileByte);

		String strFile = JPCUtilCommon.reEscpTrnToKaiCode(str);
		strFile = strFile.replaceAll(JDKStrConst.DOUBLE_QUAT + JDKStrConst.COMMA + JDKStrConst.DOUBLE_QUAT, JDKStrConst.COMMA);
		String[] lines = strFile.split(JDKStrConst.LINE_SEPARATOR);
		for (String line : lines)
		{
			String strLine = line.substring(line.startsWith(JDKStrConst.DOUBLE_QUAT) ? 1 : 0);
			String[] columns = strLine.split(JDKStrConst.COMMA);
			if (RECORD_DETAIL.equals(columns[0]))
			{
				HashMap<String, String> map = new HashMap<String, String>();
				for (int j = 0; j < columns.length; j++)
				{
					map.put(RECORD_LAYOUT_DETAIL[j], columns[j]);
				}
				retList.add(map);
			}
		}
		return retList;
	}

	/**
	 * 現在表示すべきページ番号を返します。
	 * @author 富士通
	 * @param screenId 画面ＩＤ
	 * @param command ページングにレンダリングするコマンド名
	 * @return ページ番号
	 * @throws Exception 例外発生時
	 */
	@SuppressWarnings("unchecked")
	private int getDisplayPageNumber(String screenId, String command) throws Exception
	{
		HashMap pageMap = initializePageInformation(getAllDataCount(), screenId, command);

		String displayPageNum = (String)((HashMap)pageMap.get(PAGING_TEMPLATE_ID)).get(DISPLAY_PAGE_NUM);
		return Integer.parseInt(displayPageNum) - 1;
	}

	/**
	 * ページング情報を初期化します。
	 * @author 富士通
	 * @param allDataCount 総件数
	 * @param screenId 画面ＩＤ
	 * @param command ページングにレンダリングするコマンド名
	 * @return 初期化されたページング情報
	 * @throws Exception 例外発生時
	 */
	@SuppressWarnings("unchecked")
	private HashMap initializePageInformation(int allDataCount, String screenId, String command) throws Exception
	{
		HashMap pageMap = new HashMap();
		HashMap pageInfo = new HashMap();
		pageMap.put(PAGING_TEMPLATE_ID, pageInfo);

		pageInfo.put(SEARCH_TYPE, PAGING_SEARCH_TYPE);
		String maxSearchCnt = JCCWebCommon.getSearchConst(DKW04606_MAX_SHOW_CNT);
		pageInfo.put(MAX_SEARCH_NUM, maxSearchCnt);
		String rowsPerPage = JCCWebCommon.getSearchConst(DKW04606_ROW_PER_PAGE);
		int iRowsPerPage = Integer.parseInt(rowsPerPage, 10);
		pageInfo.put(DISPLAY_NUM, rowsPerPage);

		JCCWebCommon.upmapperPageLinkInfo(this, PAGING_TEMPLATE_ID, pageMap, screenId);
		
		pageInfo.put(TOTAL_SEARCH_NUM, Integer.toString(allDataCount));
		pageInfo.put(TOTAL_PAGE_NUM, Integer.toString(allDataCount / iRowsPerPage + (allDataCount % iRowsPerPage == 0 ? 0 : 1)));
		pageInfo.put(SEARCH_ERR_FLG, "");
		
		JCCWebCommon.downmapperPageLinkInfo(this, PAGING_TEMPLATE_ID, pageMap, screenId);
		JCCWebCommon.setSearchCommand(this, command, screenId);
		
		return pageMap;
	}

	/**
	 * ファイルで保持している入荷情報（明細）の件数を取得します。
	 * @author 富士通
	 * @return 入荷情報（明細）の件数
	 */
	private int getAllDataCount()
	{
		String fileRenban = JDKWebCommon.getData(this, DKW04606SFConst.FILE_RENBAN);

		byte[] fileByte = JCCWebCommon.getFile(this, fileRenban);
		String str = new String(fileByte);
		String[] lines = str.split(JDKStrConst.LINE_SEPARATOR);

		int cnt = lines.length - 2;			// ヘッダとトレーラを引いた結果が明細件数
		return cnt;
	}

	/**
	 * 画面遷移先を設定します。
	 * @param nextScreenId 遷移先画面ＩＤ
	 * @param nextScreenName 遷移先画面名
	 */
	private void setNextScreen(String nextScreenId, String nextScreenName)
	{
		X31SDataBeanAccess  commoninfoBean = super.getCommonInfoBean();
	
		commoninfoBean.sendMessageString(CommonInfoCFConst.NEXT_SCREEN_ID, X31CWebConst.DATABEAN_SET_VALUE, nextScreenId);
		commoninfoBean.sendMessageString(CommonInfoCFConst.NEXT_SCREEN_NAME, X31CWebConst.DATABEAN_SET_VALUE, nextScreenName);

		DEBUG_LOG.debug(nextScreenName + "へ遷移する");
	}

}
