/*********************************************************************
 * All Rights reserved,Copyright (c) K-Opticom
 **********************************************************************
 *＜プログラム内容＞
 *   システム名      ：eo顧客基幹システム
 *   モジュール名    ：JKKBatCtrlPaygentAuthInfoStb
 *   ソースファイル名：JKKBatCtrlPaygentAuthInfoStb.java
 *   作成者          ：富士通
 *   日付            ：2022年05月19日
 *＜機能概要＞
 *   ペイジェントスタブテーブル接続処理部品です。
 *＜修正履歴＞
 *   バージョン  修正日       修正者      修正内容
 *   v58.00.00   2022/05/19   FJ)南      【ANK-3846-00-00】【クレカ】クリアパス→ペイジェント移行
 *   v75.00.00   2025/04/24   FJ)吉田賢	 【ANK-4682-00-00】VMルール変更に伴うクラリス対応
 **********************************************************************/
package eo.business.common;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.HashMap;
import java.util.Hashtable;
import java.util.Random;

import eo.business.util.file.JBSbatKKIFE001;
import eo.framework.item.JBSbatCommonItem;
import eo.framework.log.JBSbatLogPrintControl;

public class JKKBatCtrlPaygentAuthInfoStb  extends JKKBatPaygentStbInfo
{
	private static JKKBatCtrlPaygentAuthInfoStb instance = null;
	
	/** ログ用インスタンス */
	protected JBSbatLogPrintControl log = null;
	
	/** 部品ID*/
	private static final String PGID = "JKKBatCtrlPaygentAuthInfoStb";
	
	/**フィンガープリント前方55桁 */
	private static final String FINGERPRINT_FW = "0000000000a000000000b111111111c222222222k333333333h1234";
	
	/**
	 * インスタンス取得用のメソッド
	 * 
	 * @return JKKCtrlPaygentAuthInfoStb
	 */
	public static JKKBatCtrlPaygentAuthInfoStb getInstance()
	{
		synchronized (JKKBatCtrlPaygentAuthInfoStb.class)
		{
			if(instance == null) 
			{
				JKKBatCtrlPaygentAuthInfoStb.instance= new JKKBatCtrlPaygentAuthInfoStb();
			}
		}
		return instance;
	}
	
	/**
	 * テーブル取得処理
	 * 
	 * @param inMap 
	 * @param inContext
	 */
	@SuppressWarnings("unchecked")
	public Hashtable<String,Object> ctrlPaygentAuthStb(HashMap inMap, Connection con) throws Exception
	{
		// 開始ログ出力を実施。
		log.printDebugLog(PGID + "#ctrlPaygentAuthStb start");
		
		// レスポンス用Map
		Hashtable<String,Object> outStbMap = new Hashtable<String,Object>();
		
		// Stub用ＳＱＬ実行（ＪＤＢＣ）を行う。
		// ANK-4682-00-00 MOD START
//		Statement stmt = null;
		PreparedStatement stmt = null;
		// ANK-4682-00-00 MOD END
		StringBuffer sql = new StringBuffer();
		ResultSet rs = null;
		
		if(con == null)
		{
			// エラー
			throw new Exception("");
		}
		
		// システム日付を取得
		String sysDate = JCCBatCommon.getSysDate();
		// yyyyMMddHHmmssSSS
		String sysDateTime = JCCBatCommon.getSysDateTimeStamp();
		// ssSSSのみ抽出
		String ssSSS = sysDateTime.substring(sysDateTime.length() - 5);
		
		// 有効年月に必要な年月を取得
		String MM = sysDate.substring(4, 6);
		// 年については、2年後に変更する
		int YY = Integer.parseInt(sysDate.substring(2, 4)) + 2;
		// MMYY形式の日付を作成
		String MMYY = MM + String.valueOf(YY);
		
		// 預かりIDを取得
		String customer_id = (String)inMap.get(JBSbatKKIFE001.CR_CARDAZKRIID);
		// 預かりIDの上11桁までを抽出
		String search_customer_id = customer_id.substring(0, 11);
		
		try
		{
			sql.append("SELECT * ");
			sql.append("FROM PY_T_PAYGENT_STB ");
			sql.append("WHERE ");
			// ANK-4682-00-00 MOD START
//			sql.append("CUSTOMER_ID = " + search_customer_id);
			sql.append("CUSTOMER_ID = ?");
			// ANK-4682-00-00 MOD END
			
			// ANK-4682-00-00 MOD START
//			stmt = con.createStatement();
			stmt = con.prepareStatement(sql.toString());
			// ANK-4682-00-00 MOD END
			
			// ANK-4682-00-00 ADD START
			stmt.setString(1, search_customer_id);
			// ANK-4682-00-00 ADD END
			
			// ANK-4682-00-00 MOD START
//			rs = stmt.executeQuery(sql.toString());
			rs = stmt.executeQuery();
			// ANK-4682-00-00 MOD END
			
			// 取得結果のループ回数を保持する変数を定義
			int count = 0;
			
			// 実行結果の取得
			while(rs.next())
			{
				// カウントアップ
				count++;
				
				// エラー契機区分を取得
				String errOppKbn = rs.getString(TB_ERR_OPP_KBN);
				
				// エラー契機区分が「3(実額オーソリ)」の場合、エラー情報を返却
				if((ERR_OPP_KBN_3.equals(errOppKbn)))
				{
					// NG用の設定値を返却する
					// 処理結果
					outStbMap.put("result", "1");
					
					// レスポンスコード
					if(!isNullBlank(rs.getString(TB_RESPONSE_CODE)))
					{
						// レスポンスコードを設定
						outStbMap.put("response_code", rs.getString(TB_RESPONSE_CODE));
					}
					else
					{
						// ""(空)を設定
						outStbMap.put("response_code", "");
					}
					// レスポンス詳細
					if(!isNullBlank(rs.getString(TB_RESPONSE_DETAIL)))
					{
						// レスポンス詳細を設定
						outStbMap.put("response_detail", rs.getString(TB_RESPONSE_DETAIL));
					}
					else
					{
						// ""(空)を設定
						outStbMap.put("response_detail", "");
					}
					// 決済ID
					outStbMap.put("payment_id", "");
					// マーチャント取引ID
					outStbMap.put("trading_id", "");
					// イシュア区分
					outStbMap.put("issur_class", "");
					// 取扱カード会社コード
					outStbMap.put("acq_id", "");
					// 取扱カード会社名
					outStbMap.put("acq_name", "");
					// カード発行会社名
					outStbMap.put("issur_name", "");
					// FC取引有無
					outStbMap.put("fc_auth_umu", "");
					// 代行提携コード
					outStbMap.put("daiko_code", "");
					// カード種類コード
					outStbMap.put("card_shu_code", "");
					// カナカード名称
					outStbMap.put("k_card_name", "");
					// ACS支払人認証要求Html
					outStbMap.put("out_acs_html", "");
					// カード発行会社コード
					outStbMap.put("issur_id", "");
					// Attempt区分
					outStbMap.put("attempt_kbn", "");
					// フィンガープリント
					outStbMap.put("fingerprint", "");
					// マスクされたカード番号
					outStbMap.put("masked_card_number", "");
					// カード有効期限
					outStbMap.put("card_valid_term", "");
					// 承認番号
					outStbMap.put("shonin_no", "");
					// デビット・プリペイド判定結果
					outStbMap.put("debit_prepaid_type", "");
					// カードブランド
					outStbMap.put("card_brand", "");
				}
				else
				{
					// 上記以外の場合は、OK用の設定値を返却する
					// 処理結果
					outStbMap.put("result", "0");
					// レスポンスコード
					outStbMap.put("response_code", "");
					// レスポンス詳細
					outStbMap.put("response_detail", "");
					// 決済ID
					if(!isNullBlank(rs.getString(TB_CUSTOMER_ID)))
					{
						// 決済IDを設定
						outStbMap.put("payment_id", rs.getString(TB_CUSTOMER_ID) + "00" + ssSSS);
					}
					else
					{
						// ""(空)を設定
						outStbMap.put("payment_id", "");
					}
					// イシュア区分
					if(!isNullBlank(rs.getString(TB_ISSUR_CLASS)))
					{
						// イシュア区分を設定
						outStbMap.put("issur_class", rs.getString(TB_ISSUR_CLASS));
					}
					else
					{
						// ""(空)を設定
						outStbMap.put("issur_class", "");
					}	
					// 取扱カード会社コード
					if(!isNullBlank(rs.getString(TB_ACQ_ID)))
					{
						// 取扱カード会社コードを設定
						outStbMap.put("acq_id", rs.getString(TB_ACQ_ID));
					}
					else
					{
						// ""(空)を設定
						outStbMap.put("acq_id", "");
					}
					// 取扱カード会社名
					outStbMap.put("acq_name", "");
					// カード発行会社名
					outStbMap.put("issur_name", "");
					// FC取引有無
					outStbMap.put("fc_auth_umu", "");
					// 代行提携コード
					outStbMap.put("daiko_code", "");
					// カード種類コード
					outStbMap.put("card_shu_code", "");
					// カナカード名称
					outStbMap.put("k_card_name", "");
					// ACS支払人認証要求Html
					outStbMap.put("out_acs_html", "");
					// カード発行会社コード
					outStbMap.put("issur_id", "");
					// Attempt区分
					outStbMap.put("attempt_kbn", "");
					// フィンガープリント※固定値およびランダムな9桁の数値を設定
					outStbMap.put("fingerprint", FINGERPRINT_FW + getRandFingerPrinte());
					// マスクされたカード番号
					if(!isNullBlank(rs.getString(TB_MASKED_CARD_NO)))
					{
						// マスクされたカード番号を設定
						outStbMap.put("masked_card_number", rs.getString(TB_MASKED_CARD_NO));
					}
					else
					{
						// ""(空)を設定
						outStbMap.put("masked_card_number", "");
					}
					// カード有効期限
					outStbMap.put("card_valid_term", MMYY);
					// 承認番号
					outStbMap.put("shonin_no", getRandShoninNo());
					// デビット・プリペイド判定結果
					if(!isNullBlank(rs.getString(TB_DEBIT_PREPAID_TYPE)))
					{
						// デビット・プリペイド判定結果を設定
						outStbMap.put("debit_prepaid_type", rs.getString(TB_DEBIT_PREPAID_TYPE));
					}
					else
					{
						// ""(空)を設定
						outStbMap.put("debit_prepaid_type", "");
					}
					// カードブランド
					if(!isNullBlank(rs.getString(TB_CARD_BRAND)))
					{
						// カードブランドを設定
						outStbMap.put("card_brand", rs.getString(TB_CARD_BRAND));
					}
					else
					{
						// ""(空)を設定
						outStbMap.put("card_brand", "");
					}
				}
			}
			
			// 1件も処理しない場合は、オーソリNGとする
			if (count == 0)
			{
				log.printDebugLog("スタブテーブルに該当するデータが存在しないため、オーソリNG");
				
				// NG用の設定値を返却する
				// 処理結果
				outStbMap.put("result", "1");
				
				// レスポンスコード
				outStbMap.put("response_code", "9999");
				// レスポンス詳細
				outStbMap.put("response_detail", "スタブテーブルに該当するレコードが存在しません。");
				// 決済ID
				outStbMap.put("payment_id", "");
				// マーチャント取引ID
				outStbMap.put("trading_id", "");
				// イシュア区分
				outStbMap.put("issur_class", "");
				// 取扱カード会社コード
				outStbMap.put("acq_id", "");
				// 取扱カード会社名
				outStbMap.put("acq_name", "");
				// カード発行会社名
				outStbMap.put("issur_name", "");
				// FC取引有無
				outStbMap.put("fc_auth_umu", "");
				// 代行提携コード
				outStbMap.put("daiko_code", "");
				// カード種類コード
				outStbMap.put("card_shu_code", "");
				// カナカード名称
				outStbMap.put("k_card_name", "");
				// ACS支払人認証要求Html
				outStbMap.put("out_acs_html", "");
				// カード発行会社コード
				outStbMap.put("issur_id", "");
				// Attempt区分
				outStbMap.put("attempt_kbn", "");
				// フィンガープリント
				outStbMap.put("fingerprint", "");
				// マスクされたカード番号
				outStbMap.put("masked_card_number", "");
				// カード有効期限
				outStbMap.put("card_valid_term", "");
				// 承認番号
				outStbMap.put("shonin_no", "");
				// デビット・プリペイド判定結果
				outStbMap.put("debit_prepaid_type", "");
				// カードブランド
				outStbMap.put("card_brand", "");
			}
		}
		catch (SQLException e)
		{
			e.printStackTrace();
			outStbMap.put(RESULT, "1");
			outStbMap.put(RESPONSE_DETAIL, "ペイジェント連携独自処理部品（検証環境用）でエラーが発生しました。");
		}
		finally
		{
			try
			{
				if(stmt != null)
				{
					stmt.close();
				}
				if (rs != null)
				{
					rs.close();
				}
			}
			catch (SQLException e)
			{
				e.printStackTrace();
				outStbMap.put(RESULT, "1");
				outStbMap.put(RESPONSE_DETAIL, "ペイジェント連携独自処理部品（検証環境用）でエラーが発生しました。");
			}
		}
		// 終了ログ出力を実施。
		log.printDebugLog(PGID + "#ctrlPaygentAuthStb end");
		
		return outStbMap;
	}
	
	/**
	 * フィンガープリントの末尾9桁のランダムな数値を返却
	 * @return String value ランダムな9桁数値文字列
	 */
	private String getRandFingerPrinte()
	{
		Random r = new Random();
		String value = String.valueOf(r.nextInt(899999999) + 100000000);
		
		return value;
	}
	
	/**
	 * 承認番号用の7桁のランダムな数値を返却
	 * @return String value ランダムな7桁数値文字列
	 */
	private String getRandShoninNo()
	{
		Random r = new Random();
		String value = String.valueOf(r.nextInt(8999999) + 1000000);
		
		return value;
	}
	
	/**
	 * null又は空文字の場合、trueを返却する
	 * 
	 * @param str 検査対象文字列
	 * @return true:null、又は空文字／false:左記以外
	 */
	public static boolean isNullBlank(String str)
	{
		if (null == str || "".equals(str))
		{
			return true;
		}
		return false;
	}
	
	/**
	 * ロガー設定
	 * 
	 * @param commonItem
	 */
	public void setlogger(JBSbatCommonItem commonItem)
	{
		log = commonItem.getLogPrint();
	}
}