//
//  VeriTrans BuySmart Flex
//  adapter kit sample　SIMDKUtil.java　Version 1.0.1
//  Copyright (c) 2001-2002 VeriTrans Inc.
//  Note: SIMDKUtil for BuySmart Flex.
//

// CUSTOM:
//   URL を変えたいときはカスタマイズしてください
package jp.co.sint.mdk;

import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.io.UnsupportedEncodingException;
import java.util.Enumeration;
import java.util.Hashtable;
import java.util.StringTokenizer;

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

import jp.co.sint.config.SIConfig;
import jp.co.sint.tools.SIUtil;

import org.apache.log4j.Category;

import Jp.BuySmart.JPGWLib.Transaction;
import Jp.BuySmart.JPGWLib.TransactionFactory;

//
// PURPOSE:
//   パッケージ中の各クラスで利用されるユーティリティメソッドを格納したクラス
//
// ATTENTION:
//   基本的にカスタマイズする必要はありません
//
public class SIMDKUtil {
  //ログ用のインスタンスの生成
  private static Category log=Category.getInstance(SIConfig.SILOG4J_WEBSHOP_CATEGORY_NAME);

  // 文字エンコーディング
  private static String encodingEucJp = "EUC_JP"; // EUC
  private static String encodingShiftJis = "MS932"; // SJIS // 7.4.0 ST2060 修正

  // キャラクタセット
  private static String charsetEucJp = "euc-jp"; // EUC
  private static String charsetShiftJis = "MS932"; // SJIS // 7.4.0 ST2060 修正

  //
  // PURPOSE:
  //   あつかう日本語が EUC かどうか判定する
  //   (CCCustom クラスの encoding が euc に設定されているかどうか)
  //
  // INPUT:
  //
  // RETURN:
  //   EUC : true , SJIS : false
  //
  // ATTENTION:
  //
  public static boolean isEuc() {
    if ((SIMDKConfig.encoding).equals("euc")) return true;
    return false;
  }

  //
  // PURPOSE:
  //   あつかう日本語が SJIS かどうか判定する
  //   (CCCustom クラスの encoding が sjis に設定されているかどうか)
  //
  // INPUT:
  //
  // RETURN:
  //   EUC : false , SJIS : true
  //
  // ATTENTION:
  //
  public static boolean isSjis() {
    if ((SIMDKConfig.encoding).equals("sjis")) return true;
    return false;
  }

  //
  // PURPOSE:
  //   Java のクラスライブラリで利用するエンコーディング文字列をえる
  //
  // INPUT:
  //
  // RETURN:
  //   エンコーディングを表す文字列
  //
  // ATTENTION:
  //
  public static String getEncoding() {
    if (isEuc()) return encodingEucJp; // EUC
    return encodingShiftJis; // else SJIS
  }

  //
  // PURPOSE:
  //   キャラクタセット文字列をえる
  //
  // INPUT:
  //
  // RETURN:
  //   EUC : euc-jp , SJIS : shift_jis
  //
  // ATTENTION:
  //
  public static String getCharset() {
    if (isEuc()) return charsetEucJp; // EUC
    return charsetShiftJis; // else SJIS
  }

  //
  // PURPOSE:
  //   META タグに指定する CONTENT 文字列をえる
  //
  // INPUT:
  //
  // RETURN:
  //   CONTENT 文字列
  //
  // ATTENTION:
  //
  public static String getContent() {
    return "text/html; charset=" + getCharset();
  }

  //
  // PURPOSE:
  //   VeriTrans イメージロゴをえる
  //
  // INPUT:
  //
  // RETURN:
  //   HTML の IMG タグ文字列
  //
  // ATTENTION:
  //
  public static String getCClogo(int lIndex) {
    return SIMDKConfig.MDK_IMAGE_DIR + "/" + SIMDKConfig.MDK_VERITRANS_LOGO[lIndex]+".gif";
  }

  //
  // PURPOSE:
  //   HTML の冒頭部分を出力する
  //
  // INPUT:
  //   pw    -  出力先のリファレンス
  //   title -  <TITLE> にする文字列
  //
  // RETURN:
  //
  // ATTENTION:
  //
  public static void printHeader(PrintWriter pw, String title) {
    pw.println("<html>");
    pw.println("<head>");
    pw.print("<meta http-equiv=\"Content-Type:\" content=\"");
    pw.print(getContent());
    pw.println("\">");
    pw.println("<title>");
    pw.println(title);
    pw.println("</title>");
    pw.println("</head>");
    pw.println("<body>");
  }

  //
  // PURPOSE:
  //   HTML の末尾部分を出力する
  //
  // INPUT:
  //   pw    -  出力先のリファレンス
  //
  // RETURN:
  //
  // ATTENTION:
  //
  public static void printFooter(PrintWriter pw) {
    pw.println("</body>");
    pw.println("</html>");
  }

  //
  // PURPOSE:
  //   #???# のタグを置き換える
  //
  // INPUT:
  //   s     -  置き換え対象の文字列
  //   token -  置き換えたいキー(???)と置き換える文字が格納されたハッシュ
  //
  // RETURN:
  //   置き換えられた文字列
  //
  // ATTENTION:
  //
  public static String replaceToken(String s, Hashtable token) {
    StringBuffer sb = new StringBuffer(s);
    Enumeration e = token.keys();
    while (e.hasMoreElements()) {
      String key = (String)e.nextElement();
      String value = (String)token.get(key);
      key = "#" + key + "#";
      int start = (sb.toString()).indexOf(key);
      while (start >= 0) {
        int end = start + key.length();
        sb.replace(start, end, value);
        start = (sb.toString()).indexOf(key);
      }
    }
    return sb.toString();
  }

  //
  // PURPOSE:
  //   HTML テンプレートを出力する
  //   同時にタグの置き換えもおこなう
  //
  // INPUT:
  //   pw    -  出力先
  //   file  -  テンプレートファイル名
  //   token -  置き換えたいキー(???)と置き換える文字が格納されたハッシュ
  //
  // RETURN:
  //   置き換えられた文字列
  //
  // ATTENTION:
  //
  public static void printTemplate(PrintWriter pw, String template, Hashtable token) throws IOException {
    token.put("content", getContent());
    try {
      String path = new String(SIMDKConfig.MDK_TEMPLATE_DIR+ System.getProperty("file.separator") + template);
      FileInputStream fis = new FileInputStream(path);
      BufferedReader br = new BufferedReader(new InputStreamReader(fis,getEncoding()));
      while (br.ready()) {
        String content = br.readLine();
        content = replaceToken(content, token);
        pw.println(content);
      }
      br.close();
      fis.close();
    }catch(IOException e) {
      throw e;
    }
  }

  //
  // PURPOSE:
  //   エンコーディングにあったレスポンスライターをえる
  //
  // INPUT:
  //   response -  Servlet の response
  //
  // RETURN:
  //   PrintWriter のリファレンス
  //
  // ATTENTION:
  //
  public static PrintWriter getWriter(HttpServletResponse response) throws UnsupportedEncodingException, IOException {
    try {
      return new PrintWriter(new OutputStreamWriter(response.getOutputStream(), SIMDKUtil.getEncoding()), true);
    }catch (UnsupportedEncodingException uee) {
      throw uee;
    }catch (IOException ioe) {
      throw ioe;
    }
  }

  //
  // PURPOSE:
  //   POST & GET のデータをえる
  //
  // INPUT:
  //   response -  Servlet の response
  //
  // RETURN:
  //   データのキーと値のペアが格納されたハッシュ
  //
  // ATTENTION:
  //
  public static Hashtable getQuery(HttpServletRequest request) {
    Hashtable params = new Hashtable();
    Enumeration e = request.getParameterNames();
    while (e.hasMoreElements()) {
      String key = (String)e.nextElement();
      String[] values = request.getParameterValues(key);
      params.put(key, values[0]);
    }
    return params;
  }

  //
  // PURPOSE:
  //   カード会社ロゴを表示するイメージタグを生成する
  //
  // INPUT:
  //
  // RETURN:
  //   HTML の IMG タグ 文字列
  //
  // ATTENTION:
  //   表示するカード会社のを増やしたい場合は ccbsx.conf の ACCEPTS の
  //   設定も確認してください
  //
  public static String getCardLogo() {
    String logo = new String();
    StringTokenizer st = new StringTokenizer(getAccepts(), ",");
    while (st.hasMoreTokens()) {
      String token = (st.nextToken()).trim();

      if (token.length() > 0) {
        logo += "&nbsp;<img src=";
        logo += SIMDKConfig.MDK_IMAGE_DIR;
        logo += "/";
      }

      // CUSTOM:
      //   カード会社のロゴを増やしたいときはこの部分を修正してください.
      if (token.equals("vs")) { // VISA
        logo += "visa";
      }else if (token.equals("mc")) { // MASTER
        logo += "mastercard";
      }else if (token.equals("jcb")) { // JCB
        logo += "jcb";
      }else if (token.equals("ax")) { // AMEX
        logo += "amex";
      }else if (token.equals("ni")) { // NICOS
        logo += "nicos";
      }else if (token.equals("dc")) { // DINERS
        logo += "dinersclub";
      }

      if (token.length() > 0) {
        logo += ".gif>";
      }
    }
    return logo;
  }

  public static String getAccepts(){
    // MDK のインスタンスを作成
    TransactionFactory lFactory = null;
    try {
      lFactory = new TransactionFactory(SIMDKConfig.MDK_CONFIG_FILE);
    } catch (Exception e) {
    }
    Transaction lTran = lFactory.createInstance();
    
    //payrequestをなげる
    Hashtable param = new Hashtable();
    param.put("order-id","");
    param.put("amount","");
    param.put("note","");

    Hashtable lConfigMap= lTran.sendMServer("payrequest",param);
    mapList(lConfigMap);
    String lAccepts=(String)lConfigMap.get("accepts");
    if (SIUtil.isNull(lAccepts)) return "";
    else return lAccepts;
  }

  public static void temporaryDifficulties(PrintWriter pw, String msg) {
    printHeader(pw, "一時的エラー");
    pw.println("<h1>" + msg + "</h1>");
    pw.println("<p>");
    pw.print("御迷惑をおかけしておりますが");
    pw.print("しばらくお待ちいただいてから再度やり直していただくか");
    pw.println("当店のカスタマーサポートにお問い合わせください。<br>");
    pw.println("フリーダイヤル 0120-xxxxxx");
    pw.println("</p>");
    printFooter(pw);
  }

  public static void mapList(Hashtable params) {
    Enumeration e = params.keys();
    while (e.hasMoreElements()) {
      String key = (String)e.nextElement();
      log.debug(key + "=" + (String)params.get(key));
    }
  }
}