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

import java.sql.Connection;
import java.util.Enumeration;
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.SICartDetail;
import jp.co.sint.basic.SICartManager;
import jp.co.sint.basic.SICustAddress;
import jp.co.sint.basic.SIFrontBasic;
import jp.co.sint.basic.SIMallShop;
import jp.co.sint.basic.SIOrderDelivery;
import jp.co.sint.basic.SIOrderDetail;
import jp.co.sint.basic.SIOrderDetailPK;
import jp.co.sint.basic.SIReserveCartManager;
import jp.co.sint.basic.SIReserveOrder;
import jp.co.sint.basic.SITax;
import jp.co.sint.basic.SIUserInfo;
import jp.co.sint.config.SIConfig;
import jp.co.sint.tools.SICheckDataConf;
import jp.co.sint.tools.SICheckValid;
import jp.co.sint.tools.SICustomErrors;
import jp.co.sint.tools.SIHTMLUtil;
import jp.co.sint.tools.SIUtil;
import jp.co.sint.tools.SICustomError;//7.1.1 ST0211 追加
import jp.co.sint.tools.SIURLParameter;//7.1.1 ST0236 追加

import org.apache.log4j.Category;

/**
 * @version $Id: UIDeliveryList.java,v 1.0 2003/11/19 Exp $
 * @author  <a href="mailto: jwchen@sint.co.jp">jwchen</a>
 * <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>
 * jwchen        2003/11/19 14:34:26  Original
 */
public class UIDeliveryList extends SIFrontBasic{
  //ログ用のインスタンスの生成
  private static Category log=Category.getInstance(SIConfig.SILOG4J_WEBSHOP_CATEGORY_NAME);
  
  private LinkedHashMap amountMap=new LinkedHashMap();
  
  //ショップコード
  private String shopCode="";
  
  //商品コード
  private String cmdtyCode="";
  
  //規格1
  private String stndrdCode1="";
  
  //エレメント1
  private String elementCode1="";
  
  //規格2
  private String stndrdCode2="";
  
  //エレメント2
  private String elementCode2="";
  
  //リフレッシュ用AddressCode
  private String addressCodeTxt="";
  
  //呼び出し元
  private String callFlag="";
  
  private boolean closeWindow=false;
  
  private boolean refreshOpener=false;
  
  public UIDeliveryList(){}
  
  public void setAmount(String lName,String lValue){
    lValue=SIUtil.str2Int(lValue);//7.1.1 ST0177 追加
    if (SIUtil.isNull(lName)) return ;
    if (SIUtil.isNull(lValue))lValue="0";
    else lValue=SIUtil.changeTo(lValue.trim(),this.encode);
    amountMap.put(lName,lValue);
  }
  
  public void setCloseWindow(boolean lCloseWindow){
    this.closeWindow =lCloseWindow;
  }
  
  public void setRefreshOpener(boolean lRefreshOpener){
    this.refreshOpener =lRefreshOpener;
  }
  
  public void setShopCode(String lShopCode){
    if (SIUtil.isNull(lShopCode))lShopCode="";
    this.shopCode =lShopCode;
  }
  
  public void setCmdtyCode(String lCmdtyCode){
    if (SIUtil.isNull(lCmdtyCode))lCmdtyCode="";
    this.cmdtyCode =lCmdtyCode;
  }
  
  //setter of 規格1
  public void setStndrdCode1(String lStndrdCode1){
    if (SIUtil.isNull(lStndrdCode1)) lStndrdCode1="";
    this.stndrdCode1=SIUtil.changeTo(lStndrdCode1.trim(),this.encode);
  }
  
  //setter of エレメント1
  public void setElementCode1(String lElementCode1){
    if (SIUtil.isNull(lElementCode1)) lElementCode1="";
    this.elementCode1=SIUtil.changeTo(lElementCode1.trim(),this.encode);
  }
  
  //setter of 規格2
  public void setStndrdCode2(String lStndrdCode2){
    if (SIUtil.isNull(lStndrdCode2)) lStndrdCode2="";
    this.stndrdCode2=SIUtil.changeTo(lStndrdCode2.trim(),this.encode);
  }
  
  //setter of エレメント2
  public void setElementCode2(String lElementCode2){
    if (SIUtil.isNull(lElementCode2)) lElementCode2="";
    this.elementCode2=SIUtil.changeTo(lElementCode2.trim(),this.encode);
  }
  
  //setter of リフレッシュ用AddressCode
  public void setAddressCodeTxt(String lAddressCodeTxt){
    if (SIUtil.isNull(lAddressCodeTxt)) lAddressCodeTxt="";
    this.addressCodeTxt=SIUtil.changeTo(lAddressCodeTxt.trim(),this.encode);
  }
  
  //setter of 呼び出し元
  public void setCallFlag(String lCallFlag){
    if (SIUtil.isNull(lCallFlag)) lCallFlag="";
    this.callFlag=SIUtil.changeTo(lCallFlag.trim(),this.encode);
  }
  
  public String getShopCode(){
    return this.shopCode;
  }
  
  public String getCmdtyCode(){
    return this.cmdtyCode;
  }
  
  //getter of 規格1
  public String getStndrdCode1(){
    return this.stndrdCode1;
  }
  
  //getter of エレメント1
  public String getElementCode1(){
    return this.elementCode1;
  }
  
  //getter of 規格2
  public String getStndrdCode2(){
    return this.stndrdCode2;
  }
  
  //getter of エレメント2
  public String getElementCode2(){
    return this.elementCode2;
  }
  
  //getter of リフレッシュ用AddressCode
  public String getAddressCodeTxt(){
    return this.addressCodeTxt;
  }
  
  //getter of 呼び出し元
  public String getCallFlag(){
    return this.callFlag;
  }
  
  public String getAmount(String lName){
    String lValue=(String)amountMap.get(lName);
    if (SIUtil.isNull(lValue)) return "";
    else return lValue;
  }
  
  public boolean getCloseWindow(){
    return this.closeWindow;
  }
  
  public boolean getRefreshOpener(){
    return this.refreshOpener;
  }
  
  public String getQry(){
    return "&shc="+getShopCode()+"&cmc="+getCmdtyCode()+
           "&snc1="+getStndrdCode1()+"&ec1="+getElementCode1()+
           "&snc2="+getStndrdCode2()+"&ec2="+getElementCode2();
  }
  
  //7.1.1 ST0236 修正 ここから
  public void init(HttpServletRequest lRequest,SIURLParameter lUrlParam){
    super.init(lRequest,lUrlParam);
    this.setShopCode((String)lUrlParam.getParam("shc"));
    this.setCmdtyCode((String)lUrlParam.getParam("cmc"));
    this.setStndrdCode1((String)lUrlParam.getParam("snc1"));//規格1
    this.setElementCode1((String)lUrlParam.getParam("ec1"));//エレメント1
    this.setStndrdCode2((String)lUrlParam.getParam("snc2"));//規格2
    this.setElementCode2((String)lUrlParam.getParam("ec2"));//エレメント2
    this.setCallFlag((String)lUrlParam.getParam("callflag"));//呼び出し元の画面
  }
  //7.1.1 ST0236 修正 ここまで
  
  public void initAmount(HttpServletRequest lRequest,SIURLParameter lUrlParam){//7.1.1 ST0236 修正
    Enumeration lNameEnum=lRequest.getParameterNames();
    String lName="";
    
    this.setEncode(SIConfig.SIENCODE_SHIFT_JIS);
    this.init(lRequest,lUrlParam);//7.1.1 ST0236 修正
    
    while (lNameEnum.hasMoreElements()){
      lName=(String)lNameEnum.nextElement();
      if (lName.startsWith(SIConfig.SIPREFIX_ORDER_COUNTER_AMOUNT_NAME)){
        setAmount(lName,(String)lUrlParam.getParam(lName));//7.1.1 ST0236 修正
      }
    }
  }
  
  //7.1.1 ST0236 修正 ここから
  public void initRefresh(HttpServletRequest lRequest,SIURLParameter lUrlParam){
    this.setEncode(SIConfig.SIENCODE_SHIFT_JIS);
    this.init(lRequest,lUrlParam);
    this.setAddressCodeTxt((String)lUrlParam.getParam("addressCodeTxt"));
  }
  //7.1.1 ST0236 修正 ここまで
  
  //7.1.1 ST0211 修正 ここから
  /**
   * <b>validate</b>
   * 配送先画面から入力した商品数量などのチェック
   * @param  request リクエスト
   * @param  lConnection へのコネクション
   * @return チェックの結果(true:エラーなし、false:エラーがある)
   * @throws なし
   */
  public boolean validate(HttpServletRequest lRequest,Connection lConnection){
    return validate(lRequest,lConnection,true);
  }
  
  /**
   * <b>validate</b>
   * 配送先画面から入力した商品数量などのチェック
   * @param  request リクエスト
   * @param  lConnection へのコネクション
   * @param  mode true:フロント false:バック 
   * @return チェックの結果(true:エラーなし、false:エラーがある)
   * @throws なし
   */
  public boolean validate(HttpServletRequest lRequest,Connection lConnection,boolean mode){
  //7.1.1 ST0211 修正 ここまで
    HttpSession session=lRequest.getSession(true);//セッションの取得
    
    LinkedHashMap detailMap=(LinkedHashMap)session.getAttribute(SIConfig.SISESSION_CART_DETAIL_NAME);
    LinkedHashMap deliveryMap=(LinkedHashMap)session.getAttribute(SIConfig.SISESSION_CART_DELIVERY_NAME);
    //ログインユーザーの情報の取得
    SIUserInfo lUserInfo=SIHTMLUtil.getUserInfo(lRequest);
    
    SICartManager cartMan=new SICartManager();
    SIOrderDetailPK lPk=new SIOrderDetailPK();
    SIMallShop lMallShop=new SIMallShop();
    SICustomErrors errors=new SICustomErrors();
    
    Iterator lIta=amountMap.keySet().iterator();
    SIOrderDelivery lOrderDelivery=new SIOrderDelivery();
    SICustAddress lAddress=new SICustAddress();
    
    String lAmountName="";
    String lResValid="";
    String lTotalAmount="0";
    String lReserveAmount="0";
    
    SIOrderDetail lOrderDetail=new SIOrderDetail();
    SICartCmdty lCartCmdty=new SICartCmdty();
    SIReserveOrder lReserveOrder=new SIReserveOrder();
    lReserveOrder.setShopCode(getShopCode());
    lReserveOrder.setCmdtyCode(getCmdtyCode());
    lReserveOrder.setStndrdCode1(getStndrdCode1());
    lReserveOrder.setElementCode1(getElementCode1());
    lReserveOrder.setStndrdCode2(getStndrdCode2());
    lReserveOrder.setElementCode2(getElementCode2());
    
    //まず、予約商品の数量のチェック
    //7.1.1 ST0211 修正 ここから
    while (errors.isEmpty()&&lIta.hasNext()){
      lAmountName=(String)lIta.next();
      SICheckValid.checkValid(errors,"数量",getAmount(lAmountName),SICheckDataConf.SICHECK_DATA_DIGIT_TYPE);
      if (errors.isEmpty()){
        lTotalAmount=SIUtil.add_LL(lTotalAmount,getAmount(lAmountName));
      }
    }
    
    //在庫数量のチェック
    if (errors.isEmpty()){
      SIReserveCartManager lRsrCartManager=(SIReserveCartManager)session.getAttribute(SIConfig.SISESSION_RESERVE_CART_INFO_NAME);
      if (lRsrCartManager==null)lRsrCartManager=new SIReserveCartManager();
      //予約数量の取得
      lReserveAmount=lRsrCartManager.getAmount(lReserveOrder.getShopCode(),
                                               lReserveOrder.getCmdtyCode(),
                                               lReserveOrder.getStndrdCode1(),
                                               lReserveOrder.getElementCode1(),
                                               lReserveOrder.getStndrdCode2(),
                                               lReserveOrder.getElementCode2());
      //当分処理する商品情報の取得
      lCartCmdty=new SICartCmdty(lReserveOrder.getShopCode(),
                                 lReserveOrder.getCmdtyCode(),
                                 lReserveOrder.getStndrdCode1(),
                                 lReserveOrder.getElementCode1(),
                                 lReserveOrder.getStndrdCode2(),
                                 lReserveOrder.getElementCode2());
      if (!lCartCmdty.reset(lConnection,mode)){//在庫数量の取得
        errors.addError(new SICustomError("manager.app.sale.expired"));
        lRequest.setAttribute(SIConfig.SIERROR_ATTRIBUTE_MESSAGE_KEY,errors);
        setCloseWindow(errors.isEmpty());
        return errors.isEmpty();
      }
      
      int lCartAmount=Integer.parseInt(lTotalAmount)-Integer.parseInt(lReserveAmount);//予約数量を除いてカート数量
      
      if (mode&&lCartAmount<0){//予約数量を下回り
        errors.addError(new SICustomError("input.data.greater",lCartCmdty.getCartCmdtyName()+"に対して変更後の数量","予約商品の数量("+lReserveAmount+")"));
      }else if (mode&&lCartCmdty.getAmountFlg().equals("1")&&//在庫数の超過
                lCartCmdty.getNoStockFlg().equals("0")&&
                lCartAmount>Integer.parseInt(lCartCmdty.getAmount())){
        if (Integer.parseInt(lReserveAmount)>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()));
        }
      }
    }
    //7.1.1 ST0211 修正 ここまで
    
    //セッションに商品数量の設定
    if (errors.isEmpty()){
      //商品取得
      lCartCmdty=new SICartCmdty(getShopCode(),
                                 getCmdtyCode(),
                                 getStndrdCode1(),
                                 getElementCode1(),
                                 getStndrdCode2(),
                                 getElementCode2());
      lCartCmdty.reset(lConnection);
      lCartCmdty.setMemberDiscountRate(lUserInfo.getDiscountRate());
      
      lIta=amountMap.keySet().iterator();
      while (lIta.hasNext()){
        lAmountName=(String)lIta.next();
        
        //数量の項目名に基づいて、受注明細コードの取得
        lPk.setFieldNameTxt(lAmountName);
        lOrderDetail=(SIOrderDetail)detailMap.get(lPk.getOrderDetailCode());
        
        if (getAmount(lAmountName).equals("0")){
          detailMap.remove(lPk.getOrderDetailCode());
        }else if (lOrderDetail==null){
          //新規作成
          lOrderDetail=new SIOrderDetail();
          lOrderDetail.setEncode(SIConfig.SIENCODE_NONE);
          SICartDetail.copy(lCartCmdty,lOrderDetail);
          
          lOrderDetail.setDetailCode(lPk.getOrderDetailCode());//受注詳細コード
          lOrderDetail.setAmount(getAmount(lAmountName));//数量
          lTotalAmount=SIUtil.add_LL(lTotalAmount,getAmount(lAmountName));//総量の計算
          lPk.setShopCode(lOrderDetail.getShopCode());
          lPk.setDeliveryTypeName(lOrderDetail.getDeliveryTypeName());//配送先コードを「配送コード~配送業者名~ショップコード」にする
          lOrderDetail.setDeliveryCode(lPk.getOrderDeliveryCode());//配送先コード
          
          //put into map
          detailMap.put(lPk.getOrderDetailCode(),lOrderDetail);
          log.debug("lPk.getOrderDeliveryCode()="+lPk.getOrderDeliveryCode());
          if (deliveryMap.get(lPk.getOrderDeliveryCode())==null){
            //配送先情報の取得
            lAddress=new SICustAddress(lUserInfo.getCustCode(),lPk.getAddressCode());
            log.debug("lPk.getAddressCode()="+lPk.getAddressCode());
            lOrderDelivery=new SIOrderDelivery();
            lAddress.reset(lConnection);
            SICartDetail.copy(lAddress,lOrderDelivery);
            
            //ショップコードから送料フラグを取得します
            lMallShop=new SIMallShop();
            lMallShop.setMallShopCode(lPk.getShopCode());
            lMallShop.reset(lConnection);
            lOrderDelivery.setDeliveryTaxFlg(lMallShop.getDeliveryTaxFlg());
            lOrderDelivery.setTaxRate(SITax.getTaxRate(lConnection));
            lOrderDelivery.setAddressCode(lPk.getAddressCode());
            lOrderDelivery.setShopCode(lPk.getShopCode());
            //7.2.0 ST1030 追加 ここから
            lOrderDelivery.setShopName(lOrderDetail.getShopName());
            lOrderDelivery.setDeliveryTypeCode(lOrderDetail.getDeliveryTypeCode());
            //7.2.0 ST1030 追加 ここまで
            lOrderDelivery.setDeliveryTypeName(lPk.getDeliveryTypeName());
            lOrderDelivery.setDeliveryCode(lPk.getOrderDeliveryCode());
            deliveryMap.put(lPk.getOrderDeliveryCode(),lOrderDelivery);
          }
        }else{
          lOrderDetail.setAmount(getAmount(lAmountName));
          detailMap.put(lPk.getOrderDetailCode(),lOrderDetail);
          log.debug("change the amount to "+getAmount(lAmountName)+" and put into map for "+lPk.getOrderDetailCode());
        }
      }
      //カートの最新状況を再計算
      // EDBTG003-00 nagayoshi del start
//      cartMan.adjustAmount(lRequest,lConnection);
//      session.setAttribute(SIConfig.SISESSION_CART_INFO_NAME,cartMan);
      // EDBTG003-00 nagayoshi del end
      session.setAttribute(SIConfig.SISESSION_CART_DETAIL_NAME,detailMap);
      session.setAttribute(SIConfig.SISESSION_CART_DELIVERY_NAME,deliveryMap);
      jp.co.sint.beans.front.UICasher.reset(lRequest);//7.1.1 ST0154 追加
    }
    
    if (!errors.isEmpty()) lRequest.setAttribute(SIConfig.SIERROR_ATTRIBUTE_MESSAGE_KEY,errors);
    else lRequest.removeAttribute(SIConfig.SIERROR_ATTRIBUTE_MESSAGE_KEY);
    setCloseWindow(errors.isEmpty());
    return errors.isEmpty();
  }
  
  public void deliveryRefresh(HttpServletRequest lRequest,Connection lConnection){
    HttpSession session=lRequest.getSession(true);//セッションの取得
    
    LinkedHashMap deliveryMap=(LinkedHashMap)session.getAttribute(SIConfig.SISESSION_CART_DELIVERY_NAME);
    //ログインユーザーの情報の取得
    SIUserInfo lUserInfo=SIHTMLUtil.getUserInfo(lRequest);
    
    SIOrderDelivery lOrderDelivery=new SIOrderDelivery();
    SICustAddress lAddress=new SICustAddress();
    
    Iterator lIta=deliveryMap.keySet().iterator();
    
    //変更されたアドレスを取得
    lAddress=new SICustAddress(lUserInfo.getCustCode(),this.getAddressCodeTxt());
    lAddress.reset(lConnection);
    
    while (lIta.hasNext()){
      String deliveryCode = (String)lIta.next();
      lOrderDelivery = (SIOrderDelivery)deliveryMap.get(deliveryCode);
      
      //配送先情報を変更
      if (lOrderDelivery.getAddressCode().equals(this.getAddressCodeTxt())){
        SICartDetail.copy(lAddress,lOrderDelivery);
        this.setRefreshOpener(true);
      }
    }
    //カートの最新状況を再計算
    session.setAttribute(SIConfig.SISESSION_CART_DELIVERY_NAME,deliveryMap);
  }
}