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

import jp.ossc.petstore.OpenstandiaConst;
import jp.ossc.petstore.common.Cart;

/**
 * カート削除アクション
 * @author ossc
 * @version $Revision: 1.2 $
 */
public class DeleteCartAction extends BaseAction {

	/**
	 * カート削除アクション実行。<br>
	 * 指定された商品をカートから削除する。<br>
	 * 削除した結果、カート内の商品数が0件の場合は「cart_empty」に遷移する。
	 * @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 {

		// 処理結果
		String result = null;
		
		// パラメータを取得
		DynaActionForm bean = (DynaActionForm)form;
		String id = (String)bean.get("product_id");
		
		// セッションを取得
		HttpSession session = request.getSession(false);
		
		// セッションからカートオブジェクトを取得
		Cart cart = (Cart)session.getAttribute(OpenstandiaConst.ENV_SES_ATRBT_CART);

		// 削除結果
		boolean deleted = false;
		
		// カートが存在しない、または、カートが空の場合はempty画面へ遷移
		if (cart == null || cart.isEmpty()) {
			result = OpenstandiaConst.ENV_FORWARD_CART_EMPTY;

		} else {
			
			// カートから該当商品を削除
			deleted = cart.deleteItem(Integer.parseInt(id));

			// カート内に指定された商品が存在しない場合エラー
			if (!deleted) {
				result = OpenstandiaConst.ENV_FORWARD_FAILURE;
				// エラーメッセージを設定
				ActionMessage msg = new ActionMessage("errors.cart.product_not_exist", id);
				ActionMessages msgs = new ActionMessages();
				msgs.add("DeleteCart", msg);
				saveMessages(request, msgs);

			// 削除した結果０件になった場合はempty画面へ遷移
			} else if (cart.isEmpty()) {
				result = OpenstandiaConst.ENV_FORWARD_CART_EMPTY;
				
			} else {
				result = OpenstandiaConst.ENV_FORWARD_SUCCESS;
				
			}
		}
		
		return mapping.findForward(result);
	}
}
