package jp.ossc.petstore.action;

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

import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;

import jp.ossc.petstore.OpenstandiaConst;
import jp.ossc.petstore.model.Customer;
import jp.ossc.petstore.peer.IPeer;
import jp.ossc.petstore.common.Cart;
import jp.ossc.petstore.dto.peerdto.OrderPeerDTO;

/**
 * 注文アクション
 * @author ossc
 * @version $Revision: 1.2 $
 */
public class OrderAction extends BaseAction {

	/**
	 * 注文peer
	 */
	private IPeer orderPeer;

	/**
	 * 注文peer設定
	 * @param orderPeer 注文peer
	 */
	public void setOrderPeer(IPeer orderPeer) {
		this.orderPeer = orderPeer;
	}

	/**
	 * 注文アクション実行。<br>
	 * 注文業務処理を呼び出し、実行結果に応じて遷移先を決定する。
	 * <ul>
	 * <li>正常終了した場合、カート情報をクリアし「success」に遷移する。
	 * <li>正常終了以外の場合、エラーメッセージを保存し「failure」に遷移する。
	 * </ul>
	 * @param mapping ActionMapping
	 * @param form ActionForm
	 * @param request HTTPリクエスト
	 * @param response HTTPレスポンス
	 * @return 画面遷移先
	 * @throws Exception Action実行時エラー
	 */
	public ActionForward execute(ActionMapping mapping, ActionForm form,
			HttpServletRequest request, HttpServletResponse response)
			throws Exception {

		// セッションを取得
		HttpSession session = request.getSession(false);

		// 顧客情報を取得
		Customer customer =
			(Customer)session.getAttribute(OpenstandiaConst.ENV_SES_ATRBT_CUSTOMER);

		// カート情報を取得
		Cart cart = (Cart)session.getAttribute(OpenstandiaConst.ENV_SES_ATRBT_CART);

		// カートチェック
		if (cart == null || cart.isEmpty()) {
			return mapping.findForward(OpenstandiaConst.ENV_FORWARD_CART_EMPTY);
		}
		
		// DTOの作成
		OrderPeerDTO dto = new OrderPeerDTO();
		dto.setCustomer(customer);
		dto.setCart(cart);
		
		// 注文処理を実行
		orderPeer.execute(dto);

		// ステータスチェック
		if (dto.getStatus() != OpenstandiaConst.ENV_STATUS_NORMAL_END) {
			saveMessages(request, dto.getActionMessages());
			return mapping.findForward(OpenstandiaConst.ENV_FORWARD_FAILURE);
		}
		
		// カート情報をクリア
		cart.clear();

		// 注文ＩＤをリクエストに格納
		request.setAttribute(OpenstandiaConst.ENV_REQ_ATRBT_ORDER_ID, dto.getOrderId());

		return mapping.findForward(OpenstandiaConst.ENV_FORWARD_SUCCESS);
		
	}
}
