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

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: UIACart.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 UIACart 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 UIACart(){
  }
  
  public UIACart(HttpServletRequest lRequest,SIURLParameter lUrlParam){
    init(lRequest,lUrlParam);
  }

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

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

  /**
   * <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;
  }

  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);
  }
  
  /**
   * 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();
  }
}
