/*********************************************************************
* All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*   システム名      ：eo顧客基幹システム
*   モジュール名    ：物流管理システム
*   ソースファイル名：DKW00204SFLogic.java
*   作成者          ：富士通
*   日付            ：2011年05月18日
*＜機能概要＞
*   返品受入登録データ読込画面を処理しするロジッククラスです。
*＜修正履歴＞
*   バージョン  修正日       修正者      修正内容
*   v1.00.00    2011/05/18   FJ          新規作成
*
**********************************************************************/
package eo.web.webview.DKW00204SF;

import static com.fujitsu.futurity.web.x31.X31SWebLog.DEBUG_LOG;

import java.io.UnsupportedEncodingException;
import java.util.ArrayList;
import java.util.HashMap;

import com.fujitsu.futurity.web.x31.X31CWebConst;
import com.fujitsu.futurity.web.x31.X31SDataBeanAccess;

import static eo.common.constant.JPCOnlineMessageConstant.*;
import static eo.web.webview.common.JDKScreenConst.SCREEN_ID_DKW00204;
import static eo.web.webview.common.JDKScreenConst.SCREEN_NAME_DKW00204;
import eo.common.constant.JDKStrConst;
import eo.common.constant.JPCOnlineMessageConstant;
import eo.common.util.JDKCommonUtil;
import eo.web.webview.JCCWebBusinessLogic;
import eo.web.webview.CommonInfoCF.CommonInfoCFConst;
import eo.web.webview.DKW00201SF.DKW00201SFConst;
import eo.web.webview.common.JCCScreenConst;
import eo.web.webview.common.JCCWebCommon;
import eo.web.webview.common.JDKWebCommon;

/**
 * 返品受入登録データ読込画面を処理しするロジッククラスです。
 * @author 富士通
 */
public class DKW00204SFLogic extends JCCWebBusinessLogic
{

	// CSV関連
	private static final String RECORD_TRAILER = "83";
	private static final String RECORD_DATA = "81";
	
	// メッセージ
	private static final String MSG_UNMATCH_COLUMN = "項目数不一致";
	private static final String MSG_COLUMN_COUNT = "項目数";
	/** メッセージ：レコード種別 */
	private static final String MSG_RECORD_SBT = "レコード種別";
	/** メッセージ：レコード種別不正 */
	private static final String MSG_RECORD_SBT_NG = "レコード種別不正";

	// その他
	private static final String HMPIN_DATE = "返品日";
	private static final String SESSION_KEY_FILE = "fileKey";

	/** シリアルバージョン */
	private static final long serialVersionUID = 1L;
	
	
	/** 最大読込可能件数 */
	private static final int MAX_READABLE_LINES = 2000;

	/**
	 * 初期表示を処理します。
	 * @author 富士通
	 * @return 成否
	 * @throws Exception 例外
	 */
	public boolean init() throws Exception
	{
		setNextScreen(SCREEN_ID_DKW00204, SCREEN_NAME_DKW00204);
		return true;
	}
	
	/**
	 * 読込ボタンを処理します。
	 * @author 富士通
	 * @return 成否
	 * @throws Exception 例外
	 */
	public boolean upload() throws Exception
	{
		ArrayList<HashMap<String, Object>>  fileInfoList  = JCCWebCommon.getFileInfoArray(this);
		
		if (fileInfoList.size() == 0)
		{
			setMessage(EKB4590_KW, "ファイル");
			return false;
		}
		
		// 共通のチェック処理の呼び出し
		if (!JDKWebCommon.isCommonFileUploaded(fileInfoList, this))
		{
			return false;
		}
		
		String file = getFileAsString(fileInfoList);

		if (!isValidColumns(file))
		{
			return false;
		}
		
		saveFileToSession(file);
		
		setNextScreen(JCCScreenConst.SCREEN_ID_CCW00105, JCCScreenConst.SCREEN_NAME_CCW00105);
		return true;
	}
	
	
	/**
	 * ファイルの内容を文字列で取得します。
	 * @author 富士通
	 * @param fileInfoList
	 * @return ファイル内容
	 */
	@SuppressWarnings("unchecked")
	private String getFileAsString(ArrayList<HashMap<String, Object>>  fileInfoList)
	{
		HashMap fileInfoMap = fileInfoList.get(0);
		String renbanKey = fileInfoMap.get(SESSION_KEY_FILE).toString();

		byte[] fileByte = JCCWebCommon.getFile(this, renbanKey);
		
		try
		{
			return new String(fileByte, "Shift_JIS");
		}
		catch (UnsupportedEncodingException e)
		{
			return new String(fileByte);
		}
	}
	
	/**
	 * ファイルの行毎に期待される項目数をチェックします。
	 * @author 富士通
	 * @param file 精査するファイル
	 * @return true:エラーなし false:エラーあり
	 */
	private boolean isValidColumns(String file)
	{
		int index = 0;
		String[] lines = file.split(JDKStrConst.LINE_SEPARATOR);
		
		if (lines.length > MAX_READABLE_LINES) {
			setMessage(EKB0640_KW, "指定されたファイル", "最大読込可能件数");
			return false;
		}
		
		for (String line : lines)
		{
			if (!isValidColumn(line, ++index))
			{
				return false;
			}
		}
		
		return true;
	}
	
	/**
	 * 指定の文字列が指定の項目数ではない場合、メッセージを設定します。
	 * @author 富士通
	 * @param line 精査する文字列
	 * @param index lineの行数
	 * @return true:エラーなし false:エラーあり
	 */
	private boolean isValidColumn(String line, int index)
	{
		line = line.replaceAll("\"", "");
		
		Integer expect = columnExpectFor(line);
		if (expect == null)
		{
			setMessage(JPCOnlineMessageConstant.EKB0830_TW, 
					Integer.toString(index), 
					MSG_RECORD_SBT,
					MSG_RECORD_SBT_NG);
			return false;
		}
		
		String [] columns = JDKCommonUtil.splitAnycase(line, ',');
		if (columns == null)
		{
			setMessage(EKB0830_TW, 
					Integer.toString(index), 
					MSG_COLUMN_COUNT,
					MSG_UNMATCH_COLUMN);
			return false;
		}
		
		if (columns.length != expect.intValue())
		{
			setMessage(EKB0830_TW, 
					Integer.toString(index),
					MSG_COLUMN_COUNT,
					MSG_UNMATCH_COLUMN);
			return false;
		}
		
		if (2 == expect.intValue())
		{
			return true;
		}
		
		if (!JDKCommonUtil.checkDate(columns[6], 8))
		{
			setMessage(EKB5210_NW, Integer.toString(index), HMPIN_DATE);
			return false;
		}
		
		return true;
	}
	
	/**
	 * データ種別毎に期待される項目数を取得します。
	 * @author 富士通
	 * @param line ファイル行
	 * @return 項目数
	 */
	private Integer columnExpectFor(String line)
	{
		if (line.startsWith(RECORD_DATA))
		{
			return 30;
		}
		else if (line.startsWith(RECORD_TRAILER))
		{
			return 2;
		}
		
		return null;
	}
	
	/**
	 * ファイル情報をセッションに保存します。
	 * @author 富士通
	 * @param file ファイル内容
	 * @throws Exception 例外発生時
	 */
	@SuppressWarnings("unchecked")
	private void saveFileToSession(String file) throws Exception
	{
		HashMap paramMap = new HashMap();
		paramMap.put(DKW00201SFConst.EFILE, file);
		
		String parentScreenId = JCCWebCommon.getScreenId(this); 
		JCCWebCommon.setScreenInfo(this, parentScreenId, paramMap);
	}
	
	/**
	 * メッセージを設定します。
	 * @author 富士通
	 * @param messageId メッセージＩＤ
	 * @param replacements 置換文字列
	 */
	private void setMessage(String messageId, String...replacements)
	{
		JCCWebCommon.setMessageInfo(this, messageId, replacements);
	}
	
	
	/**
	 * 画面遷移先を設定します。
	 * @author 富士通
	 * @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(String.format("遷移先 CD：%s NM：%s", nextScreenId, nextScreenName));
	}
}
