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

import java.sql.Connection;
//import java.util.Collection;
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.SICartDetail;
import jp.co.sint.basic.SICustAddress;
import jp.co.sint.basic.SIMallShop;
import jp.co.sint.basic.SINameValue;
import jp.co.sint.basic.SIOrderDelivery;
import jp.co.sint.basic.SIOrderDetail;
import jp.co.sint.basic.SIOrderDetailPK;
import jp.co.sint.basic.SIPointMan;
import jp.co.sint.basic.SITax;
import jp.co.sint.basic.SIUserInfo;
import jp.co.sint.beans.front.UICasher;
import jp.co.sint.config.SIConfig;
//import jp.co.sint.config.SIFlagConf;
import jp.co.sint.tools.SICheckDataConf;
import jp.co.sint.tools.SICheckValid;
//import jp.co.sint.tools.SICustomError;
import jp.co.sint.tools.SICustomErrors;
import jp.co.sint.tools.SIDateTime;
import jp.co.sint.tools.SIFlagUtil;
import jp.co.sint.tools.SIHTMLUtil;
import jp.co.sint.tools.SIUtil;
import jp.co.sint.tools.SIURLParameter;//7.1.1 ST0236 追加

import org.apache.log4j.Category;

/**
 * @version $Id: UIVCasher.java,v 1.0 2003/12/26 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/26 13:45:40  Original
 */
public class UIVCasher extends UICasher{
  //ログ用のインスタンスの生成
  private static Category log=Category.getInstance(SIConfig.SILOG4J_WEBSHOP_CATEGORY_NAME);
  
  //アドレス帳コード
  private String addressCode="";
  
  public UIVCasher(){}
  
  /**
   * <b>setAddressCode</b>
   * 配送先コードの設定
   * @param  lAddressCode 配送先コード
   * @return なし
   * @throws なし
   */
  public void setAddressCode(String lAddressCode) {
    if (SIUtil.isNull(lAddressCode)) lAddressCode="";
    this.addressCode=lAddressCode;
  }
  
  /**
   * <b>getAddressCode</b>
   * 配送先コードの取得
   * @param  なし
   * @return なし
   * @throws なし
   */
  public String getAddressCode() {
    return this.addressCode;
  }
  
  /**
   * <b>initAddress</b>
   * レジ（配送先選択）の画面から配送先選択情報の取得及び決済モールショップコードの取得
   * @param  lRequest クライアントからのリクエスト
   * @param lUrlParam
   * @return なし
   * @throws なし
   */
  //7.1.1 ST0236 修正 ここから
  public void initAddress(HttpServletRequest lRequest,SIURLParameter lUrlParam){
    SINameValue sv = SIFlagUtil.getBlank();
    String blank = sv.getName();
    super.init(lRequest,lUrlParam);
    setShopCode((String)lUrlParam.getParam("shc"));//決済のショップコード
    //  配送先のアドレス帳コード
    if(SIUtil.isNull(lRequest.getParameter("addressCode"))||SIUtil.changeToJIS(lRequest.getParameter("addressCode")).equals(blank)){//7.1.1 ST0237 修正
      setAddressCode("");
    }else{
      setAddressCode((String)lUrlParam.getParam("addressCode"));
    }
    //支払方法
    if(SIUtil.isNull((String)lUrlParam.getParam("payMethodName"))||SIUtil.changeToJIS((String)lUrlParam.getParam("payMethodName")).equals(blank)){//7.1.1 ST0237 修正
      setPayMethodName("");
    }else{
      setPayMethodName((String)lUrlParam.getParam("payMethodName"));
    }
    //支払方法保存用
    if(SIUtil.isNull((String)lUrlParam.getParam("payMethodName"))||SIUtil.changeToJIS((String)lUrlParam.getParam("payMethodName")).equals(SIFlagUtil.getBlank())){//7.1.1 ST0237 修正
      setPayMethodNameBack("");
    }else{
      setPayMethodNameBack((String)lUrlParam.getParam("payMethodName"));
    }
  }
  //7.1.1 ST0236 修正 ここまで
  
  /**
   * <b>validateAddress</b>
   * 取得した配送先情報に基づいて、各金額を計算する
   * @param  lRequest クライアントからのリクエスト
   * @param  lConnection DBへのコネンクション
   * @param lUrlParam
   * @return 一致するために、常に真
   * @throws なし
   */
  public boolean validateAddress(HttpServletRequest lRequest,Connection lConnection,SIURLParameter lUrlParam){//7.1.1 ST0236 修正
    HttpSession session=lRequest.getSession(true);//セッションの取得
    SICustomErrors errors=new SICustomErrors();
    Iterator lNameIta=deliveryDateTimeMap.keySet().iterator();
    String lName="";
    String lDate="";
    SIDateTime lDateTime=new SIDateTime();
    boolean hasError=false;
    
    LinkedHashMap detailMap=(LinkedHashMap)session.getAttribute(SIConfig.SISESSION_CART_DETAIL_NAME);//受注明細
    if (detailMap==null)detailMap=new LinkedHashMap();//7.1.1 ST0237 追加
    LinkedHashMap deliveryMap=(LinkedHashMap)session.getAttribute(SIConfig.SISESSION_CART_DELIVERY_NAME);//受注配送先
    if (deliveryMap==null)deliveryMap=new LinkedHashMap();//7.1.1 ST0237 追加
    String[] lOrderDetailCodes=(String[])detailMap.keySet().toArray(new String[0]);//明細キーリスト
    
    //ログインユーザーの情報の取得
    SIUserInfo lUserInfo=SIHTMLUtil.getUserInfo(lRequest);
    
    SIOrderDetailPK lPk=new SIOrderDetailPK();//受注関連キーの管理
    
    SIOrderDelivery lOrderDelivery=new SIOrderDelivery();//受注配送先
    SICustAddress lAddress=new SICustAddress();//顧客アドレス帳
    
    SIOrderDetail lOrderDetail=new SIOrderDetail();//受注明細
    
    for (int ii=0;ii<lOrderDetailCodes.length ;ii++){
      lOrderDetail=(SIOrderDetail)detailMap.get(lOrderDetailCodes[ii]);//受注明細レコード
      lPk=new SIOrderDetailPK(lOrderDetail.getShopCode(),//新しいキーコードの生成
                              lOrderDetail.getCmdtyCode(),
                              lOrderDetail.getIndividualCode(),//BG-MOBILEテスト 追加
                              lOrderDetail.getStndrdCode1(),
                              lOrderDetail.getElementCode1(),
                              lOrderDetail.getStndrdCode2(),
                              lOrderDetail.getElementCode2(),
                              getAddressCode());
      lPk.setDeliveryTypeName(lOrderDetail.getDeliveryTypeName());//配送種別コード
      
      // EDBTG001-03 20131010_SI add start
      String keyOrderDetailCode = lPk.getOrderDetailCode()
              + SIConfig.SIWEBSHOPPING_TOKEN + lOrderDetail.getSetCode()
              + SIConfig.SIWEBSHOPPING_TOKEN + lOrderDetail.getSetDetailCode();
      // EDBTG001-03 20131010_SI add end
      // EDBTG001-03 20131010_SI mod start
      // if (lOrderDetailCodes[ii].equals(lPk.getOrderDetailCode())){//既存と同じ
      if (lOrderDetailCodes[ii].equals(keyOrderDetailCode)){//既存と同じ
      // EDBTG001-03 20131010_SI mod end
        lOrderDetail.setDeliveryCode(lPk.getOrderDeliveryCode());//新しい受注配送先コードの設定
        // EDBTG001-03 20131010_SI mod start
        // detailMap.put(lPk.getOrderDetailCode(),lOrderDetail);
        detailMap.put(keyOrderDetailCode ,lOrderDetail);
        // EDBTG001-03 20131010_SI mod end
      }else{//新レコードの生成
        detailMap.remove(lOrderDetailCodes[ii]);//既存のデータの削除
        lOrderDetail.setDeliveryCode(lPk.getOrderDeliveryCode());//新しい受注配送先コードの設定
        // EDBTG001-03 20131010_SI mod start
        // detailMap.put(lPk.getOrderDetailCode(),lOrderDetail);
        detailMap.put(keyOrderDetailCode, lOrderDetail);
        // EDBTG001-03 20131010_SI mod end
      }
      
      //配送先リストのチェック
      if (deliveryMap.get(lPk.getOrderDeliveryCode())==null){
        log.debug("find not exist lPk.getOrderDeliveryCode()="+lPk.getOrderDeliveryCode());
        lOrderDelivery=new SIOrderDelivery();
        lAddress=new SICustAddress(lUserInfo.getCustCode(),lPk.getAddressCode());
        lAddress.reset(lConnection);
        SICartDetail.copy(lAddress,lOrderDelivery);
        lOrderDelivery.setShopCode(lOrderDetail.getShopCode());
        lOrderDelivery.setDeliveryCode(lPk.getOrderDeliveryCode());//配送種別コード
        //7.2.0 ST1030 追加 ここから
        lOrderDelivery.setDeliveryTypeCode(lOrderDetail.getDeliveryTypeCode());
        //7.2.0 ST1030 追加 ここまで
        lOrderDelivery.setDeliveryTypeName(lOrderDetail.getDeliveryTypeName());//配送種別名称
        lOrderDelivery.setTaxRate(SITax.getTaxRate(lConnection));
        SIMallShop lMallShop=new SIMallShop(lOrderDetail.getShopCode());
        lMallShop.reset(lConnection);
        lOrderDelivery.setDeliveryTaxFlg(lMallShop.getDeliveryTaxFlg());
        deliveryMap.put(lPk.getOrderDeliveryCode(),lOrderDelivery);
      }
    }
    
    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 追加
    
    //支払方法のチェック
    SICheckValid.checkValid(errors,"支払方法",this.getPayMethodName(),SICheckDataConf.SICHECK_DATA_EMPTY_TYPE);
    
    //ポイント残高の設定
    setEncode(SIConfig.SIENCODE_NONE);
    setMaxPoint(SIPointMan.getMaxPoint(lConnection,lUserInfo.getCustCode(),getCasherShopCode()));
    
    //金額等の計算
    this.calcSum(lRequest,lConnection,lUrlParam);//7.1.1 ST0236 修正
    
    //2.配送希望日のチェック
    while (lNameIta.hasNext()){
      lName=(String)lNameIta.next();
      if (lName.startsWith(SIConfig.SIPREFIX_CASHER_DELIVERY_YEAR)){
        lDate=getDate(lName);
        if (hasError==false && SICheckValid.checkValid(errors,"配送希望日時",lDate,SICheckDataConf.SICHECK_DATA_DATE_TYPE)==false){//7.2.0 ST1077 修正
          hasError=true;
        }
        
        if (hasError==false&&SICheckValid.checkValid(errors,"配送希望日","今日",lDate,lDateTime.getFullDate(),SICheckDataConf.SICHECK_DATA_DATE_GREATER_TYPE)==false){//7.2.0 ST1077 修正
          hasError=true;
        }
      }
    }
    
    /*
    //代引きの時は自宅のみしか配送できない。
    if(this.getPaymentFlg().equals(SIFlagConf.SIFLAG_PAYMENTFLG_CASH)){
      Collection lDeliveryColl=SICartDetail.getDeliveryCollection(lRequest,this.getShopCode());
      Iterator lDeliveryIta = lDeliveryColl.iterator();
      while (lDeliveryIta.hasNext()){
        lOrderDelivery=(SIOrderDelivery)lDeliveryIta.next();
        if(!lOrderDelivery.getAddressCode().equals("0")){
          errors.addError(new SICustomError("manager.app.paymethod.cash",this.getPayMethodName()));
          break;
        }
      }
    }
    */
    SICheckValid.checkValid(errors,"配送先",this.getAddressCode(),SICheckDataConf.SICHECK_DATA_EMPTY_TYPE);
    
    if (!errors.isEmpty()) lRequest.setAttribute(SIConfig.SIERROR_ATTRIBUTE_MESSAGE_KEY,errors);
    return errors.isEmpty();
  }
  
  private String getDate(String lDateName){
    String lYear="";String lMonth="";String lDay="";
    String lSeq="";
    if (lDateName.startsWith(SIConfig.SIPREFIX_CASHER_DELIVERY_DATE_TIME)){
      if (lDateName.startsWith(SIConfig.SIPREFIX_CASHER_DELIVERY_YEAR)){
        lSeq=lDateName.substring(SIConfig.SIPREFIX_CASHER_DELIVERY_YEAR.length());
      }else if (lDateName.startsWith(SIConfig.SIPREFIX_CASHER_DELIVERY_MONTH)){
        lSeq=lDateName.substring(SIConfig.SIPREFIX_CASHER_DELIVERY_MONTH.length());
      }else if (lDateName.startsWith(SIConfig.SIPREFIX_CASHER_DELIVERY_DAY)){
        lSeq=lDateName.substring(SIConfig.SIPREFIX_CASHER_DELIVERY_DAY.length());
      }
      lYear=getDeliveryDateTime(SIConfig.SIPREFIX_CASHER_DELIVERY_YEAR+lSeq);
      lMonth=getDeliveryDateTime(SIConfig.SIPREFIX_CASHER_DELIVERY_MONTH+lSeq);
      lDay=getDeliveryDateTime(SIConfig.SIPREFIX_CASHER_DELIVERY_DAY+lSeq);
      
      log.debug("getDate:lDateName="+lDateName+",lYear="+lYear+",lMonth="+lMonth+",lDay="+lDay);
      
      if (SIUtil.isNotNull(lYear)||SIUtil.isNotNull(lMonth)||SIUtil.isNotNull(lDay)){
        return lYear+"/"+lMonth+"/"+lDay;
      }
    }
    return "";
  }
  
  //7.1.1 ST0236 修正 ここから
  public void init(HttpServletRequest lRequest,Connection lConnection,SIURLParameter lUrlParam){
    this.setEncode(SIConfig.SIENCODE_SHIFT_JIS);
    super.init(lRequest,lUrlParam);
    
    //管理コード（またはショップコード）の設定
    this.setShopCode((String)lUrlParam.getParam("shc"));
    //ポイント残高の設定値の取得
    setSumByPoint((String)lUrlParam.getParam("sumByPoint"));
    setMaxPoint((String)lUrlParam.getParam("maxPoint"));
    
    //支払方法関連の再設定
    this.setPayMethodName((String)lUrlParam.getParam("payMethodName"));
    //支払方法の設定BackUp
    this.setPayMethodNameBack((String)lUrlParam.getParam("payMethodNameBack"));
    //金額の計算
    this.calcSum(lRequest,lConnection,lUrlParam);
    
    //連絡事項
    this.setContactMsg((String)lUrlParam.getParam("contactMsg"));
    
    //配送希望日時のデータの取得
    Enumeration lEnum=lRequest.getParameterNames();
    String lName="";
    
    while (lEnum.hasMoreElements()){
      lName=(String)lEnum.nextElement();
      if (lName.startsWith(SIConfig.SIPREFIX_CASHER_DELIVERY_DATE_TIME)){
        this.setDeliveryDateTime(lName,(String)lUrlParam.getParam(lName));
      }
    }
    
    //決済の情報の設定
    setCardNo1((String)lUrlParam.getParam("cardNo1"));
    setCardNo2((String)lUrlParam.getParam("cardNo2"));
    setCardNo3((String)lUrlParam.getParam("cardNo3"));
    setCardNo4((String)lUrlParam.getParam("cardNo4"));
    setReAuthFlg((String) lUrlParam.getParam("reAuthFlg"));
    setReUseFlg("1");
    
    setCardExpiredMonth((String)lUrlParam.getParam("cardExpiredMonth"));
    setCardExpiredYear((String)lUrlParam.getParam("cardExpiredYear"));
    setCustNameOfCard((String)lUrlParam.getParam("custNameOfCard"));
    setSecurityCode((String)lUrlParam.getParam("securityCode"));
    
    //7.2.0 ST0300 追加 ここから
    //選択された「コンビニの種類」のセット
    setCvsTypeCode((String)lUrlParam.getParam("cvsType"));
    setFamilyName((String)lUrlParam.getParam("familyName"));
    setFirstName((String)lUrlParam.getParam("firstName"));
    //7.2.0 ST0300 追加 ここまで
    
    this.setPageNumberTxt_Order((String)lUrlParam.getParam("pageNumberTxt_order"));
    this.setPageNumberTxt_Cust((String)lUrlParam.getParam("pageNumberTxt_cust"));
    this.setPageNumberTxt_Cmdty((String)lUrlParam.getParam("pageNumberTxt_cmdty"));
    
    this.setOrderRoute((String)lUrlParam.getParam("orderRoute"));
  }
  //7.1.1 ST0236 修正 ここまで
  
  public void setDeliveryDateTime(String lName,String lValue){
    if (SIUtil.isNull(lName)) return ;
    if (SIUtil.isNull(lValue) || lValue.startsWith("-"))lValue="";
    else lValue=SIUtil.changeTo(lValue.trim(),this.encode);
    deliveryDateTimeMap.put(lName,lValue);
  }
}