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 UpdateCartAction extends BaseAction {

	/**
	 * カート変更アクション実行。<br>
	 * カート内の商品数を指定された商品数に変更する。
	 * @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 {

		// パラメータを取得
		DynaActionForm bean = (DynaActionForm)form;
		String[] ids = (String[])bean.get("product_id");
		String[] quantities = (String[])bean.get("quantity");
		
		// セッションを取得
		HttpSession session = request.getSession(false);
		
		// セッションからカートオブジェクトを取得
		Cart cart = (Cart)session.getAttribute(OpenstandiaConst.ENV_SES_ATRBT_CART);

		// カートが存在しない、または、カートが空の場合はempty画面へ遷移
		if (cart == null || cart.isEmpty()) {
			return mapping.findForward(OpenstandiaConst.ENV_FORWARD_CART_EMPTY);
		}
		
		// 更新結果
		boolean updated = false;

		for (int i=0; i<ids.length; i++) {

			// 該当商品の数量を変更する
			updated =
				cart.updateQuantity(Integer.parseInt(ids[i]), Integer.parseInt(quantities[i]));
			
			// カート内に指定された商品が存在しない場合エラー
			if (!updated) {
				// エラーメッセージを設定
				ActionMessage msg = new ActionMessage("errors.cart.product_not_exist", ids[i]);
				ActionMessages msgs = new ActionMessages();
				msgs.add("UpdateCart", msg);
				saveMessages(request, msgs);
				return mapping.findForward(OpenstandiaConst.ENV_FORWARD_FAILURE);
			}
		}

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