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

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.SIFrontBasic;
import jp.co.sint.basic.SIInquiry;
import jp.co.sint.basic.SIUserInfo;
import jp.co.sint.beans.mallmgr.UIRegSearch;
import jp.co.sint.config.SIConfig;
import jp.co.sint.database.SIDBAccessException;
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.SIURLParameter;//7.1.1 ST0236 追加
import jp.co.sint.tools.SIUtil;

import org.apache.log4j.Category;

/**
 * @version $Id: UISearch.java,v 1.0 2005/08/26 Exp $
 * @author Fujita Jun</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>
 * Fujita Jun       2005/08/26 14:08:04  Original
 */
public class UISearch extends SIFrontBasic{

  public UISearch(){}
  
  private static Category log=Category.getInstance(SIConfig.SILOG4J_WEBSHOP_CATEGORY_NAME);
  
  private UIRegSearch regSearch = new UIRegSearch();
  private String nextUrlTxt="";
  
  /**
   * <b>init</b>
   * 入力したデータを基づいて、このbeansを設定します。
   * @param request データベースへのコネンクション
   * @return true:不正なデータがある false:ない
   * @throws なし
   */
  
  public void setNextUrlTxt(String lNextUrlTxt){
    if (SIUtil.isNull(lNextUrlTxt)) lNextUrlTxt="";
    this.nextUrlTxt=SIUtil.changeTo(lNextUrlTxt.trim(),this.encode);
  }
  
  public String getNextUrlTxt(){
    return this.nextUrlTxt;
  }
  
  public void init(HttpServletRequest lRequest,SIURLParameter lUrlParam){
    super.init(lRequest,lUrlParam);
    regSearch.init(lRequest,lUrlParam);
    this.setNextUrlTxt((String)lUrlParam.getParam("nid"));
  }
  
  public void reset(Connection lConnection){
    regSearch.reset(lConnection);
  }
  
  public UIRegSearch getRegSearch(){
    return regSearch;
  }
  
  public void setCustCode(String lCustCode){
    regSearch.setCustCode(lCustCode);
  }
  
  /**
   * validate
   * 入力したデータをチェックします。
   * 不正なデータがある場合、エラーをオブジェクトに格納します。
   * そのオブジェクトは、エラーメッセージとして画面に表示されます。
   * @param HttpServletRequest ，Connection
   * @return true:エラーがない false:エラーが１つ以上ある
   * @throws なし
   */
  public boolean validate1(HttpServletRequest lRequest, Connection lConnection) {
    lRequest.removeAttribute(SIConfig.SIERROR_ATTRIBUTE_MESSAGE_KEY);
    SICustomErrors errors = new SICustomErrors();
    UIRegSearch search = this.getRegSearch();
    
    SICheckValid.checkValid(errors, "希望商品名1", search.getHopeCmdtyName1(), SICheckDataConf.SICHECK_DATA_BYTE_LEN_WITHIN_TYPE, 100);
    SICheckValid.checkValid(errors, "希望商品名2", search.getHopeCmdtyName2(), SICheckDataConf.SICHECK_DATA_BYTE_LEN_WITHIN_TYPE, 100);
    SICheckValid.checkValid(errors, "希望商品名3", search.getHopeCmdtyName3(), SICheckDataConf.SICHECK_DATA_BYTE_LEN_WITHIN_TYPE, 100);
    SICheckValid.checkValid(errors, "希望商品名4", search.getHopeCmdtyName4(), SICheckDataConf.SICHECK_DATA_BYTE_LEN_WITHIN_TYPE, 100);
    SICheckValid.checkValid(errors, "希望商品名5", search.getHopeCmdtyName5(), SICheckDataConf.SICHECK_DATA_BYTE_LEN_WITHIN_TYPE, 100);
    
    SICheckValid.checkValid(errors, "希望数量1", search.getHopeAmount1(), SICheckDataConf.SICHECK_DATA_DIGIT_TYPE+SICheckDataConf.SICHECK_DATA_BYTE_LEN_WITHIN_TYPE, 8);
    SICheckValid.checkValid(errors, "希望数量2", search.getHopeAmount2(), SICheckDataConf.SICHECK_DATA_DIGIT_TYPE+SICheckDataConf.SICHECK_DATA_BYTE_LEN_WITHIN_TYPE, 8);
    SICheckValid.checkValid(errors, "希望数量3", search.getHopeAmount3(), SICheckDataConf.SICHECK_DATA_DIGIT_TYPE+SICheckDataConf.SICHECK_DATA_BYTE_LEN_WITHIN_TYPE, 8);
    SICheckValid.checkValid(errors, "希望数量4", search.getHopeAmount4(), SICheckDataConf.SICHECK_DATA_DIGIT_TYPE+SICheckDataConf.SICHECK_DATA_BYTE_LEN_WITHIN_TYPE, 8);
    SICheckValid.checkValid(errors, "希望数量5", search.getHopeAmount5(), SICheckDataConf.SICHECK_DATA_DIGIT_TYPE+SICheckDataConf.SICHECK_DATA_BYTE_LEN_WITHIN_TYPE, 8);
    
    if(SIUtil.isNull(search.getHopeProduct1())&&SIUtil.isNull(search.getHopeProduct2())&&SIUtil.isNull(search.getHopeProduct3())&&SIUtil.isNull(search.getHopeProduct4())&&SIUtil.isNull(search.getHopeProduct5())){
      errors = new SICustomErrors();
      errors.addError(new SICustomError("input.date.search.cmdty"));
    }
    
    if(SIUtil.isNotNull(search.getHopeProduct1())||SIUtil.isNotNull(search.getHopeCmdtyName1())||SIUtil.isNotNull(search.getHopeAmount1())||SIUtil.isNotNull(search.getHopeDeliveryDate1())){
      SICheckValid.checkValid(errors,"希望製品カテゴリ1",search.getHopeProduct1(),SICheckDataConf.SICHECK_DATA_EMPTY_TYPE);
      SICheckValid.checkValid(errors,"希望商品名1",search.getHopeCmdtyName1(),SICheckDataConf.SICHECK_DATA_EMPTY_TYPE);
      SICheckValid.checkValid(errors,"希望数量1",search.getHopeAmount1(),SICheckDataConf.SICHECK_DATA_EMPTY_TYPE);
      SICheckValid.checkValid(errors,"希望納品日1",search.getHopeDeliveryDate1(),SICheckDataConf.SICHECK_DATA_EMPTY_TYPE);
    }
    
    if(SIUtil.isNotNull(search.getHopeProduct2())||SIUtil.isNotNull(search.getHopeCmdtyName2())||SIUtil.isNotNull(search.getHopeAmount2())||SIUtil.isNotNull(search.getHopeDeliveryDate2())){
      SICheckValid.checkValid(errors,"希望製品カテゴリ2",search.getHopeProduct2(),SICheckDataConf.SICHECK_DATA_EMPTY_TYPE);
      SICheckValid.checkValid(errors,"希望商品名2",search.getHopeCmdtyName2(),SICheckDataConf.SICHECK_DATA_EMPTY_TYPE);
      SICheckValid.checkValid(errors,"希望数量2",search.getHopeAmount2(),SICheckDataConf.SICHECK_DATA_EMPTY_TYPE);
      SICheckValid.checkValid(errors,"希望納品日2",search.getHopeDeliveryDate2(),SICheckDataConf.SICHECK_DATA_EMPTY_TYPE);
    }
    
    if(SIUtil.isNotNull(search.getHopeProduct3())||SIUtil.isNotNull(search.getHopeCmdtyName3())||SIUtil.isNotNull(search.getHopeAmount3())||SIUtil.isNotNull(search.getHopeDeliveryDate3())){
      SICheckValid.checkValid(errors,"希望製品カテゴリ3",search.getHopeProduct3(),SICheckDataConf.SICHECK_DATA_EMPTY_TYPE);
      SICheckValid.checkValid(errors,"希望商品名3",search.getHopeCmdtyName3(),SICheckDataConf.SICHECK_DATA_EMPTY_TYPE);
      SICheckValid.checkValid(errors,"希望数量3",search.getHopeAmount3(),SICheckDataConf.SICHECK_DATA_EMPTY_TYPE);
      SICheckValid.checkValid(errors,"希望納品日3",search.getHopeDeliveryDate3(),SICheckDataConf.SICHECK_DATA_EMPTY_TYPE);
    }
    
    if(SIUtil.isNotNull(search.getHopeProduct4())||SIUtil.isNotNull(search.getHopeCmdtyName4())||SIUtil.isNotNull(search.getHopeAmount4())||SIUtil.isNotNull(search.getHopeDeliveryDate4())){
      SICheckValid.checkValid(errors,"希望製品カテゴリ4",search.getHopeProduct4(),SICheckDataConf.SICHECK_DATA_EMPTY_TYPE);
      SICheckValid.checkValid(errors,"希望商品名4",search.getHopeCmdtyName4(),SICheckDataConf.SICHECK_DATA_EMPTY_TYPE);
      SICheckValid.checkValid(errors,"希望数量4",search.getHopeAmount4(),SICheckDataConf.SICHECK_DATA_EMPTY_TYPE);
      SICheckValid.checkValid(errors,"希望納品日4",search.getHopeDeliveryDate4(),SICheckDataConf.SICHECK_DATA_EMPTY_TYPE);
    }
    
    if(SIUtil.isNotNull(search.getHopeProduct5())||SIUtil.isNotNull(search.getHopeCmdtyName5())||SIUtil.isNotNull(search.getHopeAmount5())||SIUtil.isNotNull(search.getHopeDeliveryDate5())){
      SICheckValid.checkValid(errors,"希望製品カテゴリ5",search.getHopeProduct5(),SICheckDataConf.SICHECK_DATA_EMPTY_TYPE);
      SICheckValid.checkValid(errors,"希望商品名5",search.getHopeCmdtyName5(),SICheckDataConf.SICHECK_DATA_EMPTY_TYPE);
      SICheckValid.checkValid(errors,"希望数量5",search.getHopeAmount5(),SICheckDataConf.SICHECK_DATA_EMPTY_TYPE);
      SICheckValid.checkValid(errors,"希望納品日5",search.getHopeDeliveryDate5(),SICheckDataConf.SICHECK_DATA_EMPTY_TYPE);
    }
    
    if (!errors.isEmpty()) lRequest.setAttribute(SIConfig.SIERROR_ATTRIBUTE_MESSAGE_KEY, errors);
    return errors.isEmpty();
  }
  
  public boolean validate2(HttpServletRequest lRequest, Connection lConnection) {
    lRequest.removeAttribute(SIConfig.SIERROR_ATTRIBUTE_MESSAGE_KEY);
    SICustomErrors errors = new SICustomErrors();
    UIRegSearch search = this.getRegSearch();
    
    SICheckValid.checkValid(errors,"お客様名",search.getCustName(),SICheckDataConf.SICHECK_DATA_EMPTY_TYPE+SICheckDataConf.SICHECK_DATA_ZENKAKU_TYPE+SICheckDataConf.SICHECK_DATA_BYTE_LEN_WITHIN_TYPE, 100);
    
    SICheckValid.checkValid(errors,"お客様名カナ",search.getCustPronName(),SICheckDataConf.SICHECK_DATA_EMPTY_TYPE+SICheckDataConf.SICHECK_DATA_ZENKAKU_KANA_TYPE+SICheckDataConf.SICHECK_DATA_BYTE_LEN_WITHIN_TYPE, 100);
    
    SICheckValid.checkValid(errors, "郵便番号(上3桁)", search.getPostCode1(), SICheckDataConf.SICHECK_DATA_EMPTY_TYPE + SICheckDataConf.SICHECK_DATA_DIGIT_TYPE);
    SICheckValid.checkValid(errors, "郵便番号(下4桁)", search.getPostCode2(), SICheckDataConf.SICHECK_DATA_EMPTY_TYPE + SICheckDataConf.SICHECK_DATA_DIGIT_TYPE);
    if (search.getPostCode1().toString().trim().length() != 3||search.getPostCode2().toString().trim().length() != 4) {errors.addError(new SICustomError("manager.app.postcode.form"));}
    
    SICheckValid.checkValid(errors, "住所1（都道府県）", search.getAddress1(), SICheckDataConf.SICHECK_DATA_EMPTY_TYPE+SICheckDataConf.SICHECK_DATA_BYTE_LEN_WITHIN_TYPE, 100);
    SICheckValid.checkValid(errors, "住所2(市区町村・番地)", search.getAddress2(), SICheckDataConf.SICHECK_DATA_EMPTY_TYPE+SICheckDataConf.SICHECK_DATA_BYTE_LEN_WITHIN_TYPE, 100);
    
    SICheckValid.checkValid(errors, "連絡先電話番号1", search.getStoreTel(), SICheckDataConf.SICHECK_DATA_EMPTY_TYPE + SICheckDataConf.SICHECK_DATA_DIGIT_TYPE);
    SICheckValid.checkValid(errors, "連絡先電話番号1", search.getStoreTel(), SICheckDataConf.SICHECK_DATA_BYTE_LEN_TYPE,9,16);
    
    SICheckValid.checkValid(errors, "連絡先電話番号2", search.getTel(), SICheckDataConf.SICHECK_DATA_DIGIT_TYPE);
    SICheckValid.checkValid(errors, "連絡先電話番号2", search.getTel(), SICheckDataConf.SICHECK_DATA_BYTE_LEN_TYPE,9,16);
    
    SICheckValid.checkValid(errors, "連絡先FAX番号", search.getFax(), SICheckDataConf.SICHECK_DATA_DIGIT_TYPE);
    SICheckValid.checkValid(errors, "連絡先FAX番号", search.getFax(), SICheckDataConf.SICHECK_DATA_BYTE_LEN_TYPE,9,16);
    
    SICheckValid.checkValid(errors, "サロン名", search.getSalonName(), SICheckDataConf.SICHECK_DATA_ZENKAKU_TYPE+SICheckDataConf.SICHECK_DATA_BYTE_LEN_WITHIN_TYPE, 100);
    
    SICheckValid.checkValid(errors, "メールアドレス", search.getEmail(), SICheckDataConf.SICHECK_DATA_EMPTY_TYPE+SICheckDataConf.SICHECK_DATA_MAIL_TYPE);
    SICheckValid.checkValid(errors, "メールアドレス", search.getEmail(), SICheckDataConf.SICHECK_DATA_BYTE_LEN_WITHIN_TYPE, 128);
    
    if (!errors.isEmpty())lRequest.setAttribute(SIConfig.SIERROR_ATTRIBUTE_MESSAGE_KEY, errors);
    return errors.isEmpty();
  }
  
  /**
   * validate
   * 入力したデータをチェックします。
   * 不正なデータがある場合、エラーをオブジェクトに格納します。
   * そのオブジェクトは、エラーメッセージとして画面に表示されます。
   * @param HttpServletRequest ，Connection
   * @return true:エラーがない false:エラーが１つ以上ある
   * @throws なし
   */
  public boolean validateMobile(HttpServletRequest lRequest, Connection lConnection) {
    lRequest.removeAttribute(SIConfig.SIERROR_ATTRIBUTE_MESSAGE_KEY);
    SICustomErrors errors = new SICustomErrors();
    UIRegSearch search = this.getRegSearch();
    
    SICheckValid.checkValid(errors, "希望商品名", search.getHopeCmdtyName1(), SICheckDataConf.SICHECK_DATA_BYTE_LEN_WITHIN_TYPE, 100);
    
    SICheckValid.checkValid(errors, "希望数量", search.getHopeAmount1(), SICheckDataConf.SICHECK_DATA_DIGIT_TYPE+SICheckDataConf.SICHECK_DATA_BYTE_LEN_WITHIN_TYPE, 8);
    
    SICheckValid.checkValid(errors,"希望製品カテゴリ",search.getHopeProduct1(),SICheckDataConf.SICHECK_DATA_EMPTY_TYPE);
    SICheckValid.checkValid(errors,"希望商品名",search.getHopeCmdtyName1(),SICheckDataConf.SICHECK_DATA_EMPTY_TYPE);
    SICheckValid.checkValid(errors,"希望数量",search.getHopeAmount1(),SICheckDataConf.SICHECK_DATA_EMPTY_TYPE);
    SICheckValid.checkValid(errors,"希望納品日",search.getHopeDeliveryDate1(),SICheckDataConf.SICHECK_DATA_EMPTY_TYPE);
    
    if (!errors.isEmpty())
      lRequest.setAttribute(SIConfig.SIERROR_ATTRIBUTE_MESSAGE_KEY, errors);
    return errors.isEmpty();
  }
  
  /**
   * getCtgryCollection
   * カテゴリコードと名称を取得します。
   * @param HttpServletRequest ，Connection
   * @return true:エラーがない false:エラーが１つ以上ある
   * @throws なし
   */
  public static Collection getCtgryCollection(Connection lConnection) {
    return getCtgryCollection(lConnection, true);
  }
  
  public static Collection getCtgryCollection(Connection lConnection, boolean addBlankFlg){
    StringBuffer lSqlBuf=new StringBuffer("SELECT CtgryName,CtgryCode FROM CtgryMTbl ");
    lSqlBuf.append("WHERE ParentCtgryCode = '/' AND abbvctgryName IS NOT NULL ");
    lSqlBuf.append("AND ctgrycode NOT IN (");
    for (int i=0;i<SIConfig.INVISIBLECTGRYS.length;i++) {
      if (i>0) lSqlBuf.append(",");
      lSqlBuf.append(SIDBUtil.SQL2Str(SIConfig.INVISIBLECTGRYS[i]));
    }
    lSqlBuf.append(") ORDER BY abbvctgryname");
    Collection lResultColl=new ArrayList();
    try {
      lResultColl=SIDBUtil.getCollection(lConnection, lSqlBuf.toString(), addBlankFlg);
    } catch (SIDBAccessException e) {
      e.printStackTrace();
    }
    return lResultColl;
  }
  
  /**
   * getCtgryName
   * カテゴリコードに対する名称を取得します。
   * @param HttpServletRequest ，Connection
   * @return true:エラーがない false:エラーが１つ以上ある
   * @throws なし
   */
  public static String getCtgryName(Connection lConnection, String lCtgryCode) throws Exception{
    Statement lStatement =null;
    ResultSet lResultSet =null;
    String ctgryName = "";
    try {
      StringBuffer lSqlBuf=new StringBuffer("SELECT CtgryName FROM CtgryMTbl ");
      lSqlBuf.append("WHERE CtgryCode ='"+ lCtgryCode +"'");
      
      lStatement = lConnection.createStatement();
      lResultSet = lStatement.executeQuery(lSqlBuf.toString());
      
      while (lResultSet.next()){
        ctgryName = lResultSet.getString("CtgryName");
      }
    }catch(Exception e){
      throw new Exception(e);
    }finally{
      SIDBUtil.close(lStatement,lResultSet);
    }
    return ctgryName;
  }
  
  public static Collection getCollection(Connection lConnection, SIUserInfo lUserInfo) throws SIDBAccessException {
    Statement lStatement = null;
    ResultSet lResultSet = null;
    SIInquiry lBasic = new SIInquiry();
    StringBuffer lSqlBuf = new StringBuffer();
    Collection lResultColl = new ArrayList();
    
    lSqlBuf.append("SELECT managementnumber,initdatetime,hopecommodityname,hopeamount,hopedeliverydate FROM lookfortbl ");
    lSqlBuf.append("WHERE custcode=").append(SIDBUtil.SQL2Str(lUserInfo.getCustCode()));
    lSqlBuf.append("ORDER BY initdatetime DESC");
    
    log.debug("lSqlBuf=" + lSqlBuf.toString());
    // 実行
    try {
      lStatement = lConnection.createStatement();
      lResultSet = lStatement.executeQuery(lSqlBuf.toString());
      
      // 商品レコードのセットの作成
      while (lResultSet.next()) {
        lBasic = new SIInquiry();
        lBasic.setManagementNumber(lResultSet.getString("managementnumber"));
        lBasic.setInitDateTime(SIDBUtil.getDate(lResultSet.getTimestamp("initdatetime")));
        lBasic.setHopeCommodityName(lResultSet.getString("hopecommodityname"));
        lBasic.setHopeAmount(lResultSet.getString("hopeamount"));
        lBasic.setHopeDeliveryDate(lResultSet.getString("hopedeliverydate"));
        lBasic.setEncode(SIConfig.SIENCODE_NONE);
        lResultColl.add(lBasic);
      }
    } catch (Exception ex) {
      throw new SIDBAccessException(ex);
    } finally {
      SIDBUtil.close(lResultSet, lStatement);
    }
    return lResultColl;
  }
}
