
package jp.co.sint.beans.mallmgr;

import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.Collection;

import javax.servlet.http.HttpServletRequest;

import jp.co.sint.basic.SIBasic;
import jp.co.sint.basic.SICmdty;
import jp.co.sint.basic.SIPriceCard;
import jp.co.sint.config.SIConfig;
import jp.co.sint.database.SIDBUtil;
import jp.co.sint.database.SITableCondition;
import jp.co.sint.database.SITableConditionManager;
import jp.co.sint.tools.SICheckDataConf;
import jp.co.sint.tools.SICheckUtil;
import jp.co.sint.tools.SICheckValid;
import jp.co.sint.tools.SICustomErrors;
import jp.co.sint.tools.SIDateTime;
import jp.co.sint.tools.SIURLParameter;
import jp.co.sint.tools.SIUtil;

public class UIPriceCardListCond extends SIBasic {
  
  private String cardNumberTxt = "";//プライスカード番号
  
  private String chargeCodeTxt = "";//担当者
  
  private String initDateYearFromCbo = "";//登録日From（年）
  
  private String initDateMonthFromCbo = "";//登録日From（月）
  
  private String initDateDayFromCbo = "";//登録日From（日）
  
  private String initDateYearToCbo = "";//登録日To（年）
  
  private String initDateMonthToCbo = "";//登録日To（月）
  
  private String initDateDayToCbo = "";//登録日To（日）
  
  private boolean searchFlg = true;
  
  public UIPriceCardListCond(){
    SIDateTime lDateTime = new SIDateTime();
    String Month = Integer.toString(lDateTime.getMonth());
    String Day = Integer.toString(lDateTime.getDay());
    
    if (Month.length() == 1) Month = "0" + Month;
    if (Day.length() == 1) Day = "0" + Day;
    
    // 受注日の年(To)
    initDateYearToCbo = Integer.toString(lDateTime.getYear());
    // 受注日の月(To)
    initDateMonthToCbo = Month;
    // 受注日の日(To)
    initDateDayToCbo = Day;
    // 入金日設定の年
    
    // 一ヶ月前の日付を取得
    lDateTime.addMonth(-1);
    Month = Integer.toString(lDateTime.getMonth());
    Day = Integer.toString(lDateTime.getDay());
    if (Month.length() == 1) Month = "0" + Month;
    if (Day.length() == 1) Day = "0" + Day;
    
    // 受注日の年(From)
    initDateYearFromCbo = Integer.toString(lDateTime.getYear());
    // 受注日の月(From)
    initDateMonthFromCbo = Month;
    // 受注日の日(From)
    initDateDayFromCbo = Day;
  }
  
  public String getCardNumberTxt() {
    return cardNumberTxt;
  }
  
  public String getChargeCodeTxt() {
    return chargeCodeTxt;
  }
  
  public String getInitDateYearFromCbo() {
    return this.initDateYearFromCbo;
  }
  
  public String getInitDateMonthFromCbo() {
    return this.initDateMonthFromCbo;
  }
  
  public String getInitDateDayFromCbo() {
    return this.initDateDayFromCbo;
  }
  
  public String getInitDateFrom() {
    return SIDateTime.getDate(getInitDateYearFromCbo(), getInitDateMonthFromCbo(), getInitDateDayFromCbo());
  }
  
  public String getInitDateYearToCbo() {
    return this.initDateYearToCbo;
  }
  
  public String getInitDateMonthToCbo() {
    return this.initDateMonthToCbo;
  }
  
  public String getInitDateDayToCbo() {
    return this.initDateDayToCbo;
  }
  
  public String getInitDateTo() {
    return SIDateTime.getDate(getInitDateYearToCbo(), getInitDateMonthToCbo(), getInitDateDayToCbo());
  }
  
  public void setCardNumberTxt(String cardNumberTxt) {
    if (SIUtil.isNull(cardNumberTxt)) cardNumberTxt = "";
    this.cardNumberTxt = cardNumberTxt;
  }
  
  public void setChargeCodeTxt(String chargeCodeTxt) {
    if (SIUtil.isNull(chargeCodeTxt)) chargeCodeTxt = "";
    this.chargeCodeTxt = chargeCodeTxt;
  }
  
  public void setInitDateYearFromCbo(String lInitDateYearFromCbo) {
    if (SIUtil.isNull(lInitDateYearFromCbo)) lInitDateYearFromCbo = "";
    this.initDateYearFromCbo = SIUtil.changeTo(lInitDateYearFromCbo.trim(), this.encode);
  }
  
  public void setInitDateMonthFromCbo(String lInitDateMonthFromCbo) {
    if (SIUtil.isNull(lInitDateMonthFromCbo)) lInitDateMonthFromCbo = "";
    this.initDateMonthFromCbo = SIUtil.changeTo(lInitDateMonthFromCbo.trim(), this.encode);
  }
  
  public void setInitDateDayFromCbo(String lInitDateDayFromCbo) {
    if (SIUtil.isNull(lInitDateDayFromCbo)) lInitDateDayFromCbo = "";
    this.initDateDayFromCbo = SIUtil.changeTo(lInitDateDayFromCbo.trim(), this.encode);
  }
  
  public void setInitDateYearToCbo(String lInitDateYearToCbo) {
    if (SIUtil.isNull(lInitDateYearToCbo)) lInitDateYearToCbo = "";
    this.initDateYearToCbo = SIUtil.changeTo(lInitDateYearToCbo.trim(), this.encode);
  }
  
  public void setInitDateMonthToCbo(String lInitDateMonthToCbo) {
    if (SIUtil.isNull(lInitDateMonthToCbo)) lInitDateMonthToCbo = "";
    this.initDateMonthToCbo = SIUtil.changeTo(lInitDateMonthToCbo.trim(), this.encode);
  }
  
  public void setInitDateDayToCbo(String lInitDateDayToCbo) {
    if (SIUtil.isNull(lInitDateDayToCbo)) lInitDateDayToCbo = "";
    this.initDateDayToCbo = SIUtil.changeTo(lInitDateDayToCbo.trim(), this.encode);
  }
  
  public void init(HttpServletRequest lRequest,SIURLParameter lUrlParam){
    super.init(lRequest, lUrlParam);
    this.setCardNumberTxt((String) lUrlParam.getParam("cardNumberTxt"));
    this.setChargeCodeTxt((String) lUrlParam.getParam("chargeCodeTxt"));
    this.setInitDateYearFromCbo((String) lUrlParam.getParam("initDateYearFromCbo"));
    this.setInitDateMonthFromCbo((String) lUrlParam.getParam("initDateMonthFromCbo"));
    this.setInitDateDayFromCbo((String) lUrlParam.getParam("initDateDayFromCbo"));
    this.setInitDateYearToCbo((String) lUrlParam.getParam("initDateYearToCbo"));
    this.setInitDateMonthToCbo((String) lUrlParam.getParam("initDateMonthToCbo"));
    this.setInitDateDayToCbo((String) lUrlParam.getParam("initDateDayToCbo"));
  }
  
  public boolean validate(HttpServletRequest lRequest) {
    lRequest.removeAttribute(SIConfig.SIERROR_ATTRIBUTE_MESSAGE_KEY);
    SICustomErrors errors = new SICustomErrors();
    SICheckValid.checkValid(errors, "登録番号", this.getCardNumberTxt(), SICheckDataConf.SICHECK_DATA_DIGIT_TYPE);
    SICheckValid.checkValid(errors, "登録番号", this.getCardNumberTxt(), SICheckDataConf.SICHECK_DATA_BYTE_LEN_WITHIN_TYPE, 8);
    SICheckValid.checkValid(errors, "登録日From", getInitDateFrom(), SICheckDataConf.SICHECK_DATA_DATE_TYPE);
    SICheckValid.checkValid(errors, "登録日To", getInitDateTo(), SICheckDataConf.SICHECK_DATA_DATE_TYPE);
    
    try {
      if (!SICheckUtil.dateEqual(this.getInitDateFrom(), this.getInitDateTo())) {
        SICheckValid.checkValid(errors, "登録日From", "登録日To", this.getInitDateFrom(), this.getInitDateTo(), SICheckDataConf.SICHECK_DATA_DATE_LESS_TYPE);
      }
    } catch (Exception e) {}
    
    if (!errors.isEmpty()) {
      lRequest.setAttribute(SIConfig.SIERROR_ATTRIBUTE_MESSAGE_KEY, errors);
      this.searchFlg = false;
    }
    
    return errors.isEmpty();
  }
  
  public String getCondtionSQL() {
    SITableConditionManager lConditionMan = new SITableConditionManager();
    
    SITableCondition DD = new SITableCondition("", "a.cardNumber", this.cardNumberTxt, SIConfig.SICONDITION_TYPE_EQUAL, SIConfig.SICONDITION_TYPE_AND);
    DD.setBlankEnable(false);
    lConditionMan.add(DD);
    
    DD = new SITableCondition("", "a.chargeCode", this.chargeCodeTxt, SIConfig.SICONDITION_TYPE_EQUAL, SIConfig.SICONDITION_TYPE_AND);
    lConditionMan.add(DD);
    
    DD = new SITableCondition("", "a.initDate", this.getInitDateFrom(), SIConfig.SICONDITION_TYPE_GREATER_EQUAL, SIConfig.SICONDITION_TYPE_AND);
    lConditionMan.add(DD);
    
    DD = new SITableCondition("", "a.initDate", this.getInitDateTo(), SIConfig.SICONDITION_TYPE_LESS_EQUAL, SIConfig.SICONDITION_TYPE_AND);
    lConditionMan.add(DD);
    
    return lConditionMan.getCondtionSQL();
  }
  
  public Collection getCollection(Connection lConnection){
    Collection resultColl = new ArrayList();
    StringBuffer lSqlBuf = new StringBuffer();
    StringBuffer lCardBuf = new StringBuffer();
    StringBuffer lCountBuf = new StringBuffer();
    Statement lStatement = null;
    ResultSet lResultSet = null;
    
    if (!this.searchFlg) return resultColl;
    
    lCardBuf.append("SELECT a.cardNumber,c.chargeName,a.initDate ");
    lCountBuf.append("SELECT count(*) ");
    
    lSqlBuf.append("FROM priceCardTbl a LEFT OUTER JOIN chargetbl c ON a.chargecode=c.chargecode ");
    lSqlBuf.append("WHERE 1=1 ");
    lSqlBuf.append(this.getCondtionSQL());
    
    lCardBuf.append(lSqlBuf);
    lCountBuf.append(lSqlBuf);
    
    lCardBuf.append("ORDER BY a.cardNumber DESC");
    
    try {
      String rowCnt = SIDBUtil.getFirstData(lConnection, lCountBuf.toString());
      if (rowCnt.equals("") || rowCnt == null) {
        rowCnt = "0";
      }
      int lRecordCount = Integer.parseInt(rowCnt);// レコード数の取得
      
      int lPageSize = this.getPageSize();// ページサイズ
      int lPageNumber = this.getPageNumer();// ページ番号
      
      int lMaxPage = lRecordCount / lPageSize;
      if (lRecordCount % lPageSize > 0) {
        lMaxPage++;
      }
      if (lPageNumber > lMaxPage) lPageNumber = lMaxPage;
      
      // 開始レコードの番号の設定
      int lFromInx = (lPageNumber - 1) * lPageSize;
      // 終止のレコード番号の設定
      int lToInx = lFromInx + lPageSize - 1;
      if (lFromInx < 0) lFromInx = 0;
      if (lToInx < 0) lToInx = 0;
      
      lStatement = lConnection.createStatement();
      lCardBuf.append(" LIMIT ").append(lPageSize);
      if(lFromInx>0) lCardBuf.append(" OFFSET ").append(lFromInx);
      lResultSet = lStatement.executeQuery(lCardBuf.toString());
      
      for (int jj = 0; jj < lFromInx; jj++)
        resultColl.add(null);
      
      int lIndex = 0;
      
      // レコードのセットの作成
      while (lResultSet.next() && lIndex < lPageSize) {
        SIPriceCard lPriceCard = new SIPriceCard();
        lPriceCard.setCardNumber(lResultSet.getString("cardNumber"));
        lPriceCard.setChargeName(lResultSet.getString("chargeName"));
        lPriceCard.setInitDate(lResultSet.getString("initDate"));
        resultColl.add(lPriceCard);
        lIndex++;
      }
      
      for (int jj = lFromInx + lPageSize; jj < lRecordCount; jj++) resultColl.add(null);
      
    } catch (Exception e) {
      e.printStackTrace();
    } finally {
      SIDBUtil.close(lResultSet, lStatement);
    }
    
    return resultColl;
  }
}