import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.ServletContext;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;

import java.util.Hashtable;
import java.io.IOException;

import Jp.BuySmart.JPGWLib.*;

/**
 * <p>ベリトランスペイメントゲートウェイに接続するための
 *    サーブレットコントローラー　サンプル</p>
 *
 *
 * @author VeriTrans, Inc.
 * @version 1.0, 2004/10 created.
 */
public class InvoiceController extends HttpServlet {
	/**
	* <p>GETリクエストを処理するメソッド</p>
	* @param request HttpServletRequest HTTPサーブレットリクエスト
	* @param response HttpServletResponse HTTPサーブレットレスポンス
	*/
	public void doGet(HttpServletRequest request,
					  HttpServletResponse response)
	  throws ServletException, IOException {

		// サーブレットコンテキストを取得
		ServletContext context = getServletContext();
		// コンテキストから決済ページのURLを取得
		String paymentURL
			= (String)context.getInitParameter("PaymentURL");
        // JSPテンプレートディレクトリのパスを取得
		String jspTemplate
			= (String)context.getInitParameter("jspTemplate");
		// マーチャントIDを取得
		String merchantID
			= (String)context.getInitParameter("merchantID");
		// 電子署名鍵を取得
		String signatureKey
			= (String)context.getInitParameter("signatureKey");

		try {
			// ShoppingCart から[取引ID],[取引金額],[記事]を取得
			ShoppingCart cart = new ShoppingCart();
			String id    = cart.getOrderID();
			String price = cart.getPrice();
			String note  = cart.getNote();

			// 決済情報を格納するMIハッシュテーブルを作成
			Hashtable mi = new Hashtable();
			mi.put("auth-type", "authonly"); /* 取引タイプ */
			mi.put("order-id", id);          /* 取引ID */
			mi.put("price", price);          /* 取引金額 */
			mi.put("payment", paymentURL);   /* 申込ページURL */

			// MIハッシュテーブルのエンドーディング文字列を取得
			String ccMi = Util.urlEncode(mi);

			// 改ざん等を防止するため電子署名を実施
			SignatureHelper helper = SignatureHelper.getInstance();
			String ccSig = helper.sign(merchantID, signatureKey, ccMi);

			// JSPテンプレートに渡すための情報をセット
			request.setAttribute("CC_MI", ccMi);
			request.setAttribute("CC_SIG", ccSig);
			request.setAttribute("order-id", id);
			request.setAttribute("amount", price);
			request.setAttribute("note", note);
			request.setAttribute("payment", paymentURL);

			// 決済ページへディスパッチ
			dispatchTo(jspTemplate + "/wallet.jsp", request, response);
		}
		// 例外処理
		catch (Exception e) {
			// 例外処理ページへディスパッチ
			System.out.println(e);
			request.setAttribute("errmsg", "処理異常が発生しました。");
			dispatchTo(jspTemplate + "/error.jsp", request, response);
		}
	}

	/**
	* <p>POST リクエストを処理するメソッド</p>
	* @param request HttpServletRequest HTTPサーブレットリクエスト
	* @param response HttpServletResponse HTTPサーブレットレスポンス
	*/
	public void doPost(HttpServletRequest request,
					   HttpServletResponse response)
	  throws ServletException, IOException {
		doGet(request, response);
	}

	/**
	* <p>JSP ページへディスパッチするメソッド</p>
	* @param jspPage ディスパッチ先の jsp ページ
	* @param request HttpServletRequest HTTPサーブレットリクエスト
	* @param response HttpServletResponse HTTPサーブレットレスポンス
	*/
	private void dispatchTo(String jspPage,
							HttpServletRequest request,
							HttpServletResponse response)
	  throws ServletException, IOException {
		RequestDispatcher dispatcher = 
			getServletContext().getRequestDispatcher(jspPage);
		dispatcher.forward(request, response);
	}
}
