/**
 * Copyright (c) 2003-2004 System Integrator Corporation.
 *                 All Rights Reserved.
 */
package jp.co.sint.beans.mobile.vod;

import java.sql.Connection;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.Iterator;
import java.util.LinkedHashMap;

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

import jp.co.sint.basic.SICartCmdty;
import jp.co.sint.basic.SICartManager;
import jp.co.sint.basic.SIFrontBasic;
import jp.co.sint.basic.SIReserveCartManager;
import jp.co.sint.config.SIConfig;
import jp.co.sint.tools.SICheckDataConf;
import jp.co.sint.tools.SICheckUtil;
import jp.co.sint.tools.SICheckValid;
import jp.co.sint.tools.SICustomError;
import jp.co.sint.tools.SICustomErrors;
import jp.co.sint.tools.SIStringUtil;
import jp.co.sint.tools.SIUtil;
import jp.co.sint.tools.SIURLParameter;//7.1.1 ST0236 追加

import org.apache.log4j.Category;

/**
 * @version $Id: UIVCart.java,v 1.0 2003/12/25 Exp $
 * @author  Jinwang Chen
 * <br>Description:
 * <p>History</p>
 * <p>Author&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Date&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Reason</p>
 *  ============&nbsp;&nbsp;&nbsp;==========&nbsp;&nbsp;===========================<br>
 * Jinwang Chen   2003/12/25 17:53:19  Original
 */
public class UIVCart extends SIFrontBasic{
  
//  ログ用のインスタンスの生成
    private static Category log=Category.getInstance(SIConfig.SILOG4J_WEBSHOP_CATEGORY_NAME);
    
//  ショップコード
    private String shopCode="";
    //商品コード
    private String cmdtyCode="";
    //在庫コード
    private String individualCode="";
    //規格コード1
    private String stndrdCode1="";
    //エレメントコード1
    private String elementCode1="";
    //規格コード2
    private String stndrdCode2="";
    //エレメントコード2
    private String elementCode2="";

    //発注数量のMap
    private HashMap amountMap=new HashMap();
    
    public UIVCart(){
    }

    public UIVCart(HttpServletRequest lRequest,SIURLParameter lUrlParam){//7.1.1 ST0236 修正
      init(lRequest,lUrlParam);
    }

    /**
     * <b>getCmdtyCode</b>
     * @param  なし
     * @return なし
     * @throws なし
     */
    public String getCmdtyCode() {
      return cmdtyCode;
    }

    /**
     * <b>getIndividualCode</b>
     * @param  なし
     * @return なし
     * @throws なし
     */
    public String getIndividualCode() {
      return individualCode;
    }

    /**
     * <b>getShopCode</b>
     * @param  なし
     * @return なし
     * @throws なし
     */
    public String getShopCode() {
      return shopCode;
    }

    /**
     * <b>getElementCode1</b>
     * エレメントコードの取得
     * @param  なし
     * @return なし
     * @throws なし
     */
    public String getElementCode1() {
      return this.elementCode1;
    }

    /**
     * <b>getElementCode2</b>
     * エレメントコードの取得
     * @param  なし
     * @return なし
     * @throws なし
     */
    public String getElementCode2() {
      return this.elementCode2;
    }

    /**
     * <b>getStndrdCode1</b>
     * 規格コード1の取得
     * @param  なし
     * @return なし
     * @throws なし
     */
    public String getStndrdCode1() {
      return this.stndrdCode1;
    }

    /**
     * <b>getStndrdCode2</b>
     * 規格コード2の取得
     * @param  なし
     * @return なし
     * @throws なし
     */
    public String getStndrdCode2() {
      return stndrdCode2;
    }

    /**
     * <b>setCmdtyCode</b>
     * @param  なし
     * @return なし
     * @throws なし
     */
    public void setCmdtyCode(String lCmdtyCode) {
      if (SIUtil.isNull(lCmdtyCode)) lCmdtyCode="";
      this.cmdtyCode = lCmdtyCode;
    }

    /**
     * <b>setIndividualCode</b>
     * @param  なし
     * @return なし
     * @throws なし
     */
    public void setIndividualCode(String lIndividualCode) {
      if (SIUtil.isNull(lIndividualCode)) lIndividualCode="";
      this.individualCode = lIndividualCode;
    }

    /**
     * <b>setShopCode</b>
     * @param  なし
     * @return なし
     * @throws なし
     */
    public void setShopCode(String lShopCode) {
      if (SIUtil.isNull(lShopCode)) lShopCode="";
      this.shopCode = lShopCode;
    }

    /**
     * <b>setElementCode1</b>
     * エレメントコード１の設定
     * @param  なし
     * @return なし
     * @throws なし
     */
    public void setElementCode1(String lElementCode1) {
      if (SIUtil.isNull(lElementCode1)) lElementCode1="";
      this.elementCode1 = lElementCode1;
    }

    /**
     * <b>setElementCode2</b>
     * エレメントコード2の設定
     * @param  なし
     * @return なし
     * @throws なし
     */
    public void setElementCode2(String lElementCode2) {
      if (SIUtil.isNull(lElementCode2)) lElementCode2="";
      this.elementCode2 = lElementCode2;
    }

    /**
     * <b>setStndrdCode1</b>
     * 規格コード１の設定
     * @param  なし
     * @return なし
     * @throws なし
     */
    public void setStndrdCode1(String lStndrdCode1) {
      if (SIUtil.isNull(lStndrdCode1)) lStndrdCode1="";
      this.stndrdCode1 =lStndrdCode1;
    }

    /**
     * <b>setStndrdCode2</b>
     * 規格コード2の設定
     * @param  なし
     * @return なし
     * @throws なし
     */
    public void setStndrdCode2(String lStndrdCode2) {
      if (SIUtil.isNull(lStndrdCode2)) lStndrdCode2="";
      this.stndrdCode2 =lStndrdCode2;
    }

    //7.1.1 ST0236 修正 ここから
    public void init(HttpServletRequest lRequest,SIURLParameter lUrlParam){
      super.init(lRequest,lUrlParam);
      setShopCode((String)lUrlParam.getParam("shc"));
      setCmdtyCode((String)lUrlParam.getParam("cmc"));
      setIndividualCode((String)lUrlParam.getParam("inc"));
      setStndrdCode1((String)lUrlParam.getParam("snc1"));
      setElementCode1((String)lUrlParam.getParam("ec1"));
      setStndrdCode2((String)lUrlParam.getParam("snc2"));
      setElementCode2((String)lUrlParam.getParam("ec2"));
      setAmount(lRequest,lUrlParam);
    }
    //7.1.1 ST0236 修正 ここまで


    /**
     * setAmount
     * @param lRequest
     * @param lUrlParam
     */
    public void setAmount(HttpServletRequest lRequest,SIURLParameter lUrlParam){
      amountMap=new HashMap();
      Enumeration lAmountNameEnum=lRequest.getParameterNames();
      String lAmountName="";
      String lAmountValue="";

      while (lAmountNameEnum.hasMoreElements()){
        lAmountName=(String)lAmountNameEnum.nextElement();
        if (lAmountName.startsWith(shopCode+SIConfig.SIWEBSHOPPING_TOKEN)){
          lAmountValue=(String)lUrlParam.getParam(lAmountName);
          setAmount(lAmountName,lAmountValue);
        }
      }
    }

    /**
     * setAmount
     * @param lName
     * @param lValue
     */
    private void setAmount(String lName,String lValue){
      lValue=SIUtil.str2Int(lValue);
      if (SIUtil.isNull(lName)) return;
      if (SIUtil.isNull(lValue)) lValue="";
      else lValue=SIUtil.changeTo(lValue.trim(),this.encode);
      amountMap.put(lName,lValue);
    }
    
    /**
     * validate
     * @param lRequest
     * @param lConnection
     * @return boolean
     */
    public boolean validate(HttpServletRequest lRequest, Connection lConnection){
      HttpSession session=lRequest.getSession(true);//セッションの取得
      SICartManager cartMan=(SICartManager)session.getAttribute(SIConfig.SISESSION_CART_INFO_NAME);
      if (cartMan==null)cartMan=new SICartManager();
      SICartCmdty lCartCmdty=new SICartCmdty();

      SICustomErrors errors = new SICustomErrors();
      Iterator amountIta=amountMap.keySet().iterator();
      String lAmountName="";
      String lAmountValue="";
      String lReserveAmountValue="";
      String[] lShopCmdtyCode={"",""};
      String lResValid="";
      boolean[] lRes={false,false};
      // EDBTG003-00 nagayoshi mod start
      // 現在のセット品の各構成品在庫数をサマリ
      LinkedHashMap amountCmdtyMap = new LinkedHashMap();
      // EDBTG003-00 nagayoshi mod end

      while (amountIta.hasNext()){
        lAmountName=(String)amountIta.next();
        lAmountValue=(String)amountMap.get(lAmountName);

        lResValid=SICheckValid.checkValid("数量",lAmountValue,SICheckDataConf.SICHECK_DATA_EMPTY_TYPE+SICheckDataConf.SICHECK_DATA_DIGIT_TYPE);
        if (SIUtil.isNull(lResValid)){
          lShopCmdtyCode=SIStringUtil.split(lAmountName,SIConfig.SIWEBSHOPPING_TOKEN);
          // EDBTG003-00 nagayoshi mod start
//          if (lShopCmdtyCode.length==7){
          if (lShopCmdtyCode.length==8){
            // EDBTG003-00 nagayoshi mod end
            lCartCmdty=new SICartCmdty();
            lCartCmdty.setEncode(SIConfig.SIENCODE_NONE);
            lCartCmdty.setShopCode(lShopCmdtyCode[0]);
            lCartCmdty.setCmdtyCode(lShopCmdtyCode[1]);
            lCartCmdty.setIndividualCode(lShopCmdtyCode[2]);
            lCartCmdty.setStndrdCode1(lShopCmdtyCode[3]);
            lCartCmdty.setElementCode1(lShopCmdtyCode[4]);
            lCartCmdty.setStndrdCode2(lShopCmdtyCode[5]);
            lCartCmdty.setElementCode2(lShopCmdtyCode[6]);
            if (!lCartCmdty.reset(lConnection,true)){
              errors.addError(new SICustomError("manager.app.sale.expired"));
              continue;
            }

            lReserveAmountValue=SIReserveCartManager.getAmount(lRequest
                                                              ,lCartCmdty.getShopCode()
                                                              ,lCartCmdty.getCmdtyCode()
                                                              ,lCartCmdty.getIndividualCode()
                                                              ,lCartCmdty.getStndrdCode1()
                                                              ,lCartCmdty.getElementCode1()
                                                              ,lCartCmdty.getStndrdCode2()
                                                              ,lCartCmdty.getElementCode2());
            log.debug("lCartCmdty.getCmdtyCode()="+lCartCmdty.getCmdtyCode()+"lCartCmdty.getIndividualCode()="+lCartCmdty.getIndividualCode()+",lCartCmdty.getAmountFlg()="+lCartCmdty.getAmountFlg());
            if (SICheckUtil.isLess(lAmountValue,lReserveAmountValue)){
              errors.addError(new SICustomError("input.data.greater",lCartCmdty.getCartCmdtyName()+"に対して変更後の数量","予約商品の数量("+lReserveAmountValue+")"));
            }else if (lCartCmdty.getAmountFlg().equals("1")&&lCartCmdty.isExceedAmount(SIUtil.sub_LD(lAmountValue,lReserveAmountValue))) {
              if (Integer.parseInt(lReserveAmountValue)>0)errors.addError(new SICustomError("manager.app.exceed.amount.with.reserve",lCartCmdty.getCartCmdtyName()));
              else if (Integer.parseInt(lCartCmdty.getAmount())<=0) errors.addError(new SICustomError("manager.app.exceed.amount.no.reserve",lCartCmdty.getCartCmdtyName()));
              else errors.addError(new SICustomError("manager.app.exceed.amount.with.cancel",lCartCmdty.getCartCmdtyName()));
              // EDBTG003-00 nagayoshi mod start
//            }else cartMan.update(lCartCmdty,lAmountValue);
            } else {
              if (lCartCmdty.isCmdtyComposition()) {
                errors = this.checkModSetAmount(lConnection, cartMan, lShopCmdtyCode, amountCmdtyMap, lAmountValue);
              } else {
                // 通常品の場合
                cartMan.update(lCartCmdty,lAmountValue);
              }
            }
            // EDBTG003-00 nagayoshi mod end
          }
        }else if ((errors.isEmpty()||!lRes[0])&&SIUtil.isNull(lAmountValue)){
          lRes[0]=true;
          errors.addError(new SICustomError("input.data.require","数量"));
        }else if (errors.isEmpty()||!lRes[1]){
          lRes[1]=true;
          errors.addError(new SICustomError("input.data.digit","数量"));
        }
      }
      session.setAttribute(SIConfig.SISESSION_CART_INFO_NAME,cartMan);
      SICartManager.clearCasher(lRequest);
      if (!errors.isEmpty())lRequest.setAttribute(SIConfig.SIERROR_ATTRIBUTE_MESSAGE_KEY,errors);
      else lRequest.removeAttribute(SIConfig.SIERROR_ATTRIBUTE_MESSAGE_KEY);
      return errors.isEmpty();
    }
}
