
package jp.co.sint.beans.front;

import java.sql.Connection;

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

import jp.co.sint.basic.SICart;
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.basic.SIUserInfo;
import jp.co.sint.config.SIConfig;
import jp.co.sint.database.SIDBUtil;
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.SIHTMLUtil;
import jp.co.sint.tools.SIStringUtil;
import jp.co.sint.tools.SIUtil;

public class UICatalogCmdty extends SIFrontBasic{
  
  private int itemCount = 20;
  private String[] cmdtyCode = new String[itemCount];
  private String[] individualHead = new String[itemCount];
  private String[] individualBody = new String[itemCount];
  private String[] amount = new String[itemCount];
  
  public UICatalogCmdty() {
    for (int i=0;i<itemCount;i++) {
      cmdtyCode[i] = "";
      individualHead[i] = "";
      individualBody[i] = "";
      amount[i] = "";
    }
  }
  
  public UICatalogCmdty(boolean isMobile) {
    if (isMobile) itemCount = 5;
    for (int i=0;i<itemCount;i++) {
      cmdtyCode[i] = "";
      individualHead[i] = "";
      individualBody[i] = "";
      amount[i] = "";
    }
  }
  
  public String[] getCmdtyCode() {
    return cmdtyCode;
  }
  
  public String[] getIndividualHead() {
    return individualHead;
  }
  
  public String[] getIndividualBody() {
    return individualBody;
  }
  
  public String[] getAmount() {
    return amount;
  }
  
  public String getAmount(int i){
    return SIStringUtil.toHalf(amount[i]);
  }
  
  public void setCmdtyCode(String[] cmdtyCode) {
    this.cmdtyCode=cmdtyCode;
  }
  
  public void setIndividualHead(String[] individualHead) {
    this.individualHead=individualHead;
  }
  
  public void setIndividualBody(String[] individualBody) {
    this.individualBody=individualBody;
  }
  
  public void setAmount(String[] amount) {
    this.amount=amount;
  }
  
  public String[] getIndividualCode() {
    String[] individualCode = new String[itemCount];
    for (int i=0;i<itemCount;i++) {
      if (SIUtil.isNotNull(individualHead[i])&&SIUtil.isNotNull(individualBody[i])) {
        individualCode[i] = SIStringUtil.toHalf(individualHead[i]).toUpperCase() + '-' + SIStringUtil.toHalf(individualBody[i]).toUpperCase();
      } else {
        individualCode[i] = "";
      }
    }
    
    return individualCode;
  }
  
  public void init(HttpServletRequest request) {
    this.setIndividualHead(request.getParameterValues("individualHead"));
    this.setIndividualBody(request.getParameterValues("individualBody"));
    this.setAmount(request.getParameterValues("amount"));
  }
  
  public boolean validate(HttpServletRequest request,Connection connection) {
    SICustomErrors errors = new SICustomErrors();
    StringBuffer lSqlBuf1 = new StringBuffer();
    StringBuffer lSqlBuf2 = new StringBuffer();
    boolean noItem = true;
    
    HttpSession session=request.getSession();
    
    SIUserInfo lUserInfo = new SIUserInfo();
    if (request != null) lUserInfo = SIHTMLUtil.getUserInfo(request);
    
    StringBuffer mk = new StringBuffer();
    if (lUserInfo.getMaker()!=null && lUserInfo.getMaker().length>0) {
      for (int m=0;m<lUserInfo.getMaker().length;m++) {
        if (m>0) mk.append(",");
        mk.append(SIDBUtil.SQL2Str(lUserInfo.getMaker()[m]));
      }
    }
    
    SICartManager cartManager=(SICartManager)session.getAttribute(SIConfig.SISESSION_CART_INFO_NAME);
    if (cartManager==null)cartManager=new SICartManager();
    
    String[] individualCode = this.getIndividualCode();
    
    for (int i=0;i<itemCount;i++) {
      String count = String.valueOf(i+1);
      boolean amountCheck = true;
      boolean duplicateCheck = false;
      try{
        if (SIUtil.isNotNull(this.getIndividualHead()[i])||SIUtil.isNotNull(this.getIndividualBody()[i])||SIUtil.isNotNull(this.getAmount()[i])) {
          if (SIUtil.isNull(this.getIndividualHead()[i])^SIUtil.isNull(this.getIndividualBody()[i])) {
            SICheckValid.checkValid(errors, "商品コード["+count+"]（前）", this.getIndividualHead()[i], SICheckDataConf.SICHECK_DATA_EMPTY_TYPE);
            SICheckValid.checkValid(errors, "商品コード["+count+"]（後）", this.getIndividualBody()[i], SICheckDataConf.SICHECK_DATA_EMPTY_TYPE);
          } else {
            if (SICheckValid.checkValid(errors, "商品コード["+count+"]", individualCode[i], SICheckDataConf.SICHECK_DATA_EMPTY_TYPE + SICheckDataConf.SICHECK_DATA_ALPHA_DIGIT_TYPE)) {
              for (int j=0;j<itemCount;j++) {
                if (i!=j&&individualCode[i].equals(individualCode[j])) duplicateCheck = true;//重複コード
              }
              lSqlBuf1 = new StringBuffer();
              lSqlBuf1.append("SELECT CmdtyCode FROM individualtbl ");
              lSqlBuf1.append("WHERE individualcode=" + SIDBUtil.SQL2Str(individualCode[i]));
              
              int errorsSize = errors.errorSize();
              if (!duplicateCheck && SICheckValid.checkExist(errors, connection, "商品コード["+count+"]", lSqlBuf1.toString())) {
                
                lSqlBuf2 = new StringBuffer();
                lSqlBuf2.append("SELECT CASE ");
                if (SIUtil.isNotNull(mk.toString())) {
                  lSqlBuf2.append("WHEN m.contractFlg='1' AND m.makercode NOT IN (").append(mk.toString()).append(") THEN 0 ");//要契約
                } else {
                  lSqlBuf2.append("WHEN m.contractFlg='1' THEN 0 ");//要契約
                }
                if (!"1".equals(lUserInfo.getHairCosmeFlg())) {//水物契約なしの場合
                  lSqlBuf2.append("WHEN substring(c.individualcode,1,1) IN ('V','H','L') THEN 5 ");
                }
                lSqlBuf2.append("WHEN c.frontdispFlg='0' THEN 1 ");//非表示
                lSqlBuf2.append("WHEN c.inquiryFlg='1' THEN 2 ");//お問い合わせ
                lSqlBuf2.append("WHEN c.amountFlg='0' THEN 9 ");//カート
                lSqlBuf2.append("WHEN c.amount>'0' THEN 9 ");//カート
                lSqlBuf2.append("WHEN c.rsrvEnableFlg='1' AND coalesce(c.rsrvAmount,'1')!='0' THEN 3 ");//予約
                lSqlBuf2.append("WHEN c.rsrvEnableFlg='1' AND coalesce(c.rsrvAmount,'1')='0' THEN 4 ");//SOLD OUT
                lSqlBuf2.append("WHEN c.soldOutDate IS NULL OR soldOutDate+"+SIConfig.DEFAULT_SOLDOUT+" > CURRENT_DATE THEN 4 ");//SOLDOUT
                lSqlBuf2.append("WHEN c.usedNewFlg IN ('1','7') THEN 4 ");//SOLDOUT
                lSqlBuf2.append("ELSE 1 END ");//非表示
                lSqlBuf2.append("FROM cmdtyunittbl c,makertbl m ");
                lSqlBuf2.append("WHERE c.makercode=m.makercode ");
                lSqlBuf2.append("AND c.individualcode=" + SIDBUtil.SQL2Str(individualCode[i]));
                
                String dispCheck = SIDBUtil.getFirstData(connection, lSqlBuf2.toString());
                
                if ("0".equals(dispCheck)) {
                  errors.addError(new SICustomError("manager.message.freeword","商品["+count+"]は要契約ブランド商品のため、契約済み会員様に限ります。"));
                } else if ("1".equals(dispCheck)) {
                  errors.addError(new SICustomError("manager.message.freeword","商品["+count+"]は廃盤、または商品コードが変更となった可能性があります。0120-974-554までお問い合わせ下さい。"));
                } else if ("2".equals(dispCheck)) {
                  errors.addError(new SICustomError("manager.message.freeword","商品["+count+"]は現在お問い合わせのみの取り扱いとなっております。詳しくは0120-974-554までお問い合わせ下さい。"));
                } else if ("3".equals(dispCheck)) {
                  errors.addError(new SICustomError("manager.message.freeword","商品["+count+"]は予約受付中のため販売されておりません。"));
                } else if ("4".equals(dispCheck)) {
                  errors.addError(new SICustomError("manager.message.freeword","商品["+count+"]は売り切れ中のため販売されておりません。"));
                } else if ("5".equals(dispCheck)) {
                  errors.addError(new SICustomError("manager.message.freeword","商品["+count+"]は化粧品のため、契約済み会員様に限ります。"));
                } else if (SICheckValid.checkValid(errors, "数量["+count+"]", getAmount(i), SICheckDataConf.SICHECK_DATA_EMPTY_TYPE + SICheckDataConf.SICHECK_DATA_DIGIT_TYPE)) {
                  this.cmdtyCode[i] = SIDBUtil.getFirstData(connection, lSqlBuf1.toString());
                  
                  //カートの中身＋入力数で在庫数量チェック
                  SICartCmdty lCartCmdty=new SICartCmdty("0",this.cmdtyCode[i],individualCode[i],"","","","");
                  if (lCartCmdty.reset(connection,true)){
                    SIReserveCartManager lRsrCartManager=(SIReserveCartManager)session.getAttribute(SIConfig.SISESSION_RESERVE_CART_INFO_NAME);
                    if (lRsrCartManager==null)lRsrCartManager=new SIReserveCartManager();
                    String lRsrAmount=lRsrCartManager.getAmount("0",this.cmdtyCode[i],individualCode[i],"","","","");
                    if (SIUtil.isNull(lRsrAmount))lRsrAmount="0";
                    int lAmount=Integer.parseInt(getAmount(i))-Integer.parseInt(lRsrAmount);
                    SICart lCart=cartManager.getCart(lCartCmdty);
                    if ("1".equalsIgnoreCase(lCartCmdty.getAmountFlg())&&Integer.parseInt(lCart.getAmount())+lAmount>Integer.parseInt(lCartCmdty.getAmount())) {
                      errors.addError(new SICustomError("manager.app.exceed.amount","商品["+count+"] "+lCartCmdty.getIndividualCode()+"（"+lCartCmdty.getCmdtyName()+"）"));
                    }
                  }else{
                    throw new Exception();
                  }
                  amountCheck = false;//数量チェック済
                } else {
                  amountCheck = false;//数量チェック済
                }
              } else {
              	// チェック前後でエラーサイズが違う（=チェックでエラー）場合
              	if (errors.errorSize() != errorsSize) {
              	  // メッセージを書き換える
                  SICustomError error = new SICustomError("manager.message.freeword", "["+count+"]において、該当する商品コードがありません。");
                  errors.getErrorList().set(errors.errorSize() - 1, error);
              	}
              }
            }
          }
          if (duplicateCheck) errors.addError(new SICustomError("manager.message.freeword","商品["+count+"]が重複しています。同一商品は一つにまとめてご入力ください。"));
          else if (amountCheck) SICheckValid.checkValid(errors, "数量["+count+"]", getAmount(i), SICheckDataConf.SICHECK_DATA_EMPTY_TYPE + SICheckDataConf.SICHECK_DATA_DIGIT_TYPE);
          noItem=false;
        }
      }catch (Exception e){
        e.printStackTrace();
        errors = new SICustomErrors();
        errors.addError(new SICustomError("database.execute.error"));
      }
    }
    if (noItem) {
      errors.addError(new SICustomError("manager.message.freeword","ご希望商品を入力してください。"));
    }
    
    if (!errors.isEmpty()) request.setAttribute(SIConfig.SIERROR_ATTRIBUTE_MESSAGE_KEY, errors);
    return errors.isEmpty();
  }
  
  public void addCart(HttpServletRequest request,Connection connection){
    this.setCartShopCodeTxt("0");
    String[] individualCode = this.getIndividualCode();
    for (int i=0;i<itemCount;i++) {
      if(SIUtil.isNotNull(individualCode[i])) {
        this.setCartCmdtyCodeTxt(this.getCmdtyCode()[i]);
        this.setCartIndividualCodeTxt(individualCode[i]);
        this.setCartAmountTxt(this.getAmount(i));
        this.setCmdtyCompositionFlg(SIConfig.CMDTY_COMPOSITION_NORMAL);
        super.addCart(request, connection);
      }
    }
  }
}