package jp.co.sint.mpi;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.ServletException;

import java.util.Hashtable;
import java.util.Map;
import java.util.Iterator;
import java.io.IOException;
import Jp.BuySmart.DddLib.Transaction;
import org.apache.log4j.Logger;


/**
 * <p>トランザクション検索を依頼するクラス.
 * 検索条件をMDKに渡し、HTMLに出力.</p>
 *  * @author SBI VeriTrans Co., Ltd.
 * @version 1.0, 2005/05 created.
 */

public  class GetTXNLoggerServlet extends McController {
  protected Logger logger = null;
  private String orderID = null;
  private String  sAction = null;
  
  /**
   *  <p>POST リクエストを処理するメソッド</p>
   *  @param request HttpServletRequest HTTPサーブレットリクエスト
   *  @param response HttpServletResponse HTTPサーブレットレスポンス
   */
  public void doPost(HttpServletRequest request,HttpServletResponse response) throws ServletException,IOException {
    // --> for debug
    String [] arr_keys =
    {
      Transaction.RES_TAG_Q_SUB_TXN_ID,
      Transaction.RES_TAG_Q_SUB_TXN_STATUS,
      Transaction.RES_TAG_Q_SUB_ACTION_CODE,
      Transaction.RES_TAG_Q_SUB_ERR_CODE,
      Transaction.RES_TAG_Q_SUB_TXN_STATE,
      Transaction.RES_TAG_Q_SUB_CARD_NUMBER,
      Transaction.RES_TAG_Q_SUB_CARD_EXP,
      Transaction.RES_TAG_Q_SUB_CORP_ID,
      Transaction.RES_TAG_Q_SUB_BRAND_ID,
      Transaction.RES_TAG_Q_SUB_AMOUNT,
      Transaction.RES_TAG_Q_SUB_ACQUIRER_BIN,
      Transaction.RES_TAG_Q_SUB_DS_LOGIN_ID,
      Transaction.RES_TAG_Q_SUB_CRRES_STATUS,
      Transaction.RES_TAG_Q_SUB_VERES_STATUS,
      Transaction.RES_TAG_Q_SUB_PARES_SIGN_STATUS,
      Transaction.RES_TAG_Q_SUB_PARES_STATUS,
      Transaction.RES_TAG_Q_SUB_PARES_ECI,
      Transaction.RES_TAG_Q_SUB_3D_MSG_VERSION,
      Transaction.RES_TAG_Q_SUB_3D_XID,
      Transaction.RES_TAG_Q_SUB_3D_XSTATUS,
      Transaction.RES_TAG_Q_SUB_3D_CAVV_ALGORITHM,
      Transaction.RES_TAG_Q_SUB_3D_CAVV,
      Transaction.RES_TAG_Q_SUB_3D_ECI,
      Transaction.RES_TAG_Q_SUB_TIME
    };
    int ii = 0;
    int jj = 0;
    int max_col = 0;
    String key2 = "";
    String val2 = "";
    String txn_id;
    
    max_col = arr_keys.length;
    
    // debug
    logger = LoggerFactory.getTraceLogger();
    
    // セッションを取得
    //HttpSession session = request.getSession();
    //logger.info("Session ID = " + session.getId()); // debug
    try {
      logger.info("****** QUERY PROCESS HAS BEGUN ******"); // debug
      Hashtable params = Util.getInstance().getQuery(request, getEncode());
      
      logger.info("getQuery... done."); // debug
      // 検索条件入力ページから期間始を取得
      final String period_from = (String)params.get(Transaction.REQ_TAG_Q_START_TIME);
      logger.info(period_from); // debug
      // 検索条件入力ページから期間終を取得
      final String period_to = (String)params.get(Transaction.REQ_TAG_Q_END_TIME);
      logger.info(period_to); // debug
      // 検索条件入力ページから 3d transaction idを取得
      final String ddd_xid = (String)params.get(Transaction.REQ_TAG_Q_3D_XID);
      logger.info(ddd_xid); // debug
      // 検索条件入力ページから3d-xstatusを取得
      final String ddd_status = (String)params.get(Transaction.REQ_TAG_Q_3D_XSTATUS);
      logger.info(ddd_status); // debug
      // 検索条件入力ページから3d-eciを取得
      final String ddd_eci = (String)params.get(Transaction.REQ_TAG_Q_3D_ECI);
      logger.info(ddd_eci); // debug
      // 検索条件入力ページからtxn_idを取得
      txn_id = (String)params.get(Transaction.REQ_TAG_Q_TXN_ID);
      logger.info(txn_id); // debug
      // 検索条件入力ページから最大検索数を取得
      final String max_records = (String)params.get(Transaction.REQ_TAG_Q_MAXCOUNT);
      // jspTemplate取得
      final String jspTemplate = getJspTemplate();
      logger.info(max_records); // debug
      
      //マーチャント指定があれば取得
      final String merchant_no = (String)params.get("merchant_specify");
      logger.info(max_records); // debug
      
      //********     MDK のクラス呼び出し   *********//
      //System.setProperty("Jp.BuySmart.DddLib.directPath", "true");
      Jp.BuySmart.DddLib.Transaction dddtran = Jp.BuySmart.DddLib.TransactionFactory.createInstance();
      
      // 検索条件を格納するMap定義
      Map cond_params = new Hashtable();
      
      cond_params = Jp.BuySmart.DddLib.TransactionFactory.createRequest();
      logger.info("initaial parameta set ... done.  "); // debug
      //コマンド文字列追加
      cond_params.put(Jp.BuySmart.DddLib.Transaction.REQ_COMMAND, Jp.BuySmart.DddLib.Transaction.CMD_QUERY);
      logger.info("add  QUERY CMD stirngs to map data ... done.  "); // debug
      
      if ((!period_from.equals("")) && (period_from != null)){
        cond_params.put(Transaction.REQ_TAG_Q_START_TIME, period_from); // 開始日時
      }
      if ((!period_to.equals("")) && (period_to != null)){
        cond_params.put(Transaction.REQ_TAG_Q_END_TIME, period_to);   // 終了日時
      }
      if ((!ddd_xid.equals("")) && (ddd_xid != null)){
        cond_params.put(Transaction.REQ_TAG_Q_3D_XID , ddd_xid);    // 取引タイプ
      }
      if ((!ddd_status.equals("")) && (ddd_status != null)){
        cond_params.put(Transaction.REQ_TAG_Q_3D_XSTATUS, ddd_status);  // 取引タイプ
      }
      if ((!ddd_eci.equals("")) && (ddd_eci != null)){
        cond_params.put(Transaction.REQ_TAG_Q_3D_ECI, ddd_eci);     // ECI
      }
      if ((!txn_id.equals("")) && (txn_id != null)){
        if (txn_id.length() != 12){
          while (txn_id.length() < 12) {
             txn_id = "0" + txn_id;
          }
          
        }
        cond_params.put(Transaction.REQ_TAG_Q_TXN_ID, txn_id);      // トランザクションID
      }
      if ((!max_records.equals("")) && (max_records != null)){
        cond_params.put(Transaction.REQ_TAG_Q_MAXCOUNT, max_records);   // 取引 ID
      }
      
      logger.info("*********** TXN LOG SEARCH conditions before execute query command **********");
      //ログ
      Iterator itr = cond_params.keySet().iterator();
      if (cond_params.size() > 0){
        while (itr.hasNext()) {
          String key = (String)itr.next();
          String value = (String)cond_params.get(key);
          logger.info("key["+ key +"]=[" + value + "]");
        }
      } 
      else {
        
        final String message = "*** 検索条件を指定してください ***";
        logger.info(message);
        request.setAttribute("errmsg", message);
        dispatchTo(jspTemplate + "/error.jsp", request, response);
        //  session.invalidate(); // セッションを無効にする
        return;
      }
      
      //MDKの呼び出し
      //戻り値Map定義
      Map receiveParams = new Hashtable();
      
      //MDK本人認証要求
      receiveParams = dddtran.doTransaction(cond_params);
      
      //検索結果取得
      //ログ
      itr = receiveParams.keySet().iterator();
      logger.info("*********** TXN LOG SEARCH RESULT from MDK **********");
      while (itr.hasNext()) {
        String key = (String)itr.next();
        String value = (String)receiveParams.get(key);
        logger.info("key["+ key +"]=[" + value + "]");
      }
      
      //LOG出力 HTML発行
      
      //String status = (String)receiveParams.get("MStatus");
      String status = (String)receiveParams.get(Transaction.RES_TAG_MSTATUS);
      if (status.equals(Transaction.RES_V_MSTATUS_SC)) { // 成功
        // -----> debug 受信した電文から検索結果情報抽出
//        logger.info("************************************************************" );
//        logger.info("************* 受信した電文から検索結果情報抽出 *************" );
//        logger.info("************************************************************" );
//        itr = receiveParams.keySet().iterator();
//        Pattern ptn = Pattern.compile("[a][0-9]+");
//        boolean b = false;
//        jj = 0;
//        Map dataList = new Hashtable();
//        Iterator itr2 = null; 
//        while (itr.hasNext()) {
//          String key = (String)itr.next();
//          String value = (String)receiveParams.get(key);
//          Matcher matcher = ptn.matcher(key);
//          b= matcher.matches();
//          if (b) {
//            jj++;
//            logger.info("************* key["+ key +"]: Row No. [" + jj + "] *************" );
//            logger.info("************* values["+ value +"] *************" );
//            dataList = Util.getInstance().urlDecode(value);
//            //logger.info("--------1" );
//            ii= 0;
//            itr2 = dataList.keySet().iterator();
//            //logger.info("--------2" );
//            while (itr2.hasNext()) {
//              key2 = (String)itr2.next();
//              val2 = (String)dataList.get(key2);
//              logger.info("key["+ key2 +"]=[" + val2 + "]");
//            }
//            while (ii< max_col) {
//              val2 = (String)dataList.get(arr_keys[ii]);
//              if (val2 == null){
//                val2 = "";
//              }
//              logger.info("************* key["+ arr_keys[ii] +"]=[" + val2 + "] *************" );
//              ii++;
//            }
//          }
//        }

        //  <-----  debug 受信した電文から検索結果情報抽出
        //受信した検索結果電文に元の検索条件の情報を付加してJSPに出力
        
        if ((!period_from.equals("")) && (period_from != null)){
          receiveParams.put(Transaction.REQ_TAG_Q_START_TIME, period_from); // 開始期間
        }
        if ((!period_to.equals("")) && (period_to != null)){
          receiveParams.put(Transaction.REQ_TAG_Q_END_TIME, period_to);     // 終了期間
        }
        if ((!ddd_xid.equals("")) && (ddd_xid != null)){
          receiveParams.put(Transaction.REQ_TAG_Q_3D_XID , ddd_xid);      // 取引タイプ
        }
        if ((!ddd_status.equals("")) && (ddd_status != null)){
          receiveParams.put(Transaction.REQ_TAG_Q_3D_XSTATUS, ddd_status);  // 取引タイプ
        }
        if ((!ddd_eci.equals("")) && (ddd_eci != null)){
          receiveParams.put(Transaction.REQ_TAG_Q_3D_ECI, ddd_eci);       // ECI
        }
        if ((!txn_id.equals("")) && (txn_id != null)){
          receiveParams.put(Transaction.REQ_TAG_Q_TXN_ID, txn_id);      // トランザクションID
        }
        if ((!max_records.equals("")) && (max_records != null)){
          receiveParams.put(Transaction.REQ_TAG_Q_MAXCOUNT, max_records);   // 取引 ID
        }
        
        //取引結果ページ表示
        request.setAttribute("result", receiveParams);
        dispatchTo(jspTemplate + "/results.jsp", request, response);
        //session.invalidate();
      }   
      else {  // 決済失敗
        // セッションを破棄する
        //session.invalidate();
        // エラーページを表示
        request.setAttribute("errmsg", "LOG検索でエラーが発生しました。");
        request.setAttribute("result", receiveParams);
        dispatchTo(jspTemplate + "/error.jsp", request, response);
        return;
      }
    }
    catch (Exception e) {
      // 例外なのでセッションを無効にする
      //session.invalidate();
      // エラーページを表示する
      dispatchToError(e, request, response);
    }
  }
}