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 org.apache.struts.action.DynaActionForm;

import jp.ossc.petstore.OpenstandiaConst;
import jp.ossc.petstore.common.Cart;
import jp.ossc.petstore.peer.IPeer;
import jp.ossc.petstore.dto.peerdto.InsertCartPeerDTO;

/**
 * カート投入アクション
 * @author ossc
 * @version $Revision: 1.2 $
 */
public class InsertCartAction extends BaseAction {

	/**
	 * カート投入peer
	 */
	private IPeer insertCartPeer;
	
	/**
	 * カート投入peer設定
	 * @param insertCartPeer カート投入peer
	 */
	public void setInsertCartPeer(IPeer insertCartPeer) {
		this.insertCartPeer = insertCartPeer;
	}

	/**
	 * カート投入アクション実行。<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);

		// セッションからカートオブジェクトを取得
		Cart cart = (Cart)session.getAttribute(OpenstandiaConst.ENV_SES_ATRBT_CART);
		if (cart == null) {
			cart = new Cart();
			session.setAttribute(OpenstandiaConst.ENV_SES_ATRBT_CART, cart);
		}

		// DTO生成
		InsertCartPeerDTO dto = new InsertCartPeerDTO();
		dto.setActionForm(form);
		
		// カート投入業務処理実行
		insertCartPeer.execute(dto);
		
		// ステータスチェック
		if (dto.getStatus() != OpenstandiaConst.ENV_STATUS_NORMAL_END) {
			saveMessages(request, dto.getActionMessages());
			return mapping.findForward(OpenstandiaConst.ENV_FORWARD_FAILURE);
		}
		
		// 数量を取得
		DynaActionForm bean = (DynaActionForm)form;
		String quantity = (String)bean.get("quantity");
		
		// カートに商品を追加
		cart.addItem(dto.getProduct(), Integer.parseInt(quantity));

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