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

import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;

import javax.servlet.http.HttpServletRequest;

import jp.co.sint.basic.SIBasic;
import jp.co.sint.basic.SICmdtyStndrd;
import jp.co.sint.basic.SICmdtyStndrdUtil;
import jp.co.sint.basic.SILogin;
import jp.co.sint.config.SIConfig;
import jp.co.sint.config.SIDBMultiConf;
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.SIHTMLUtil;
import jp.co.sint.tools.SIUtil;
import jp.co.sint.tools.SIURLParameter;//7.1.1 ST0236 追加
import oracle.jdbc.OracleTypes;

import org.apache.log4j.Category;

/**
 * @version $Id: SICmdtyStndrdListCond.java,v 1.0 2003/09/12 Exp $
 * @author  Jinwang Chen
 * <br>Description:商品規格入力画面に規格1と規格2の選択の部分を処理します。
 * <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/09/12 13:23:51  Original
 */
public class UICmdtyStndrdListCond extends SIBasic{
  //ログ用のインスタンスの生成
  private static Category log=Category.getInstance(SIConfig.SILOG4J_WEBSHOP_CATEGORY_NAME);
  
  //ショップコード
  private String shopCode="";
  
  //商品コード
  private String cmdtyCode="";
  
  //商品名
  private String cmdtyName="";
  
  //規格コード1
  private String stndrdCodeSel1="";
  
  //規格名
  private String stndrdName1="";
  
  //規格コード2
  private String stndrdCodeSel2="";
  
  //規格名2
  private String stndrdName2="";
  
  //SQL文
  private String sql="";
  
  /**
   * UICmdtyStndrdListCond
   * コンストラクタ
   * @param なし
   * @return なし
   * @throws なし
   */
  public UICmdtyStndrdListCond(){
  }
  
  //setter of ショップコード1
  public void setShopCode(String lShopCode){
    if (SIUtil.isNull(lShopCode)) lShopCode="";
    this.shopCode=SIUtil.changeTo(lShopCode.trim(),this.encode);
  }
  
  //setter of 商品コード
  public void setCmdtyCode(String lCmdtyCode){
    if (SIUtil.isNull(lCmdtyCode)) lCmdtyCode="";
    this.cmdtyCode=SIUtil.changeTo(lCmdtyCode.trim(),this.encode);
  }
  
  //setter of 商品名
  public void setCmdtyName(String lCmdtyName){
    if (SIUtil.isNull(lCmdtyName)) lCmdtyName="";
    this.cmdtyName=SIUtil.changeTo(lCmdtyName.trim(),this.encode);
  }
  
  //setter of 規格コード1
  public void setStndrdCodeSel1(String lStndrdCodeSel1){
    if (SIUtil.isNull(lStndrdCodeSel1)) lStndrdCodeSel1="";
    this.stndrdCodeSel1=SIUtil.changeTo(lStndrdCodeSel1.trim(),this.encode);
  }
  
  //setter of 規格名1
  public void setStndrdName1(String lStndrdName1){
    if (SIUtil.isNull(lStndrdName1)) lStndrdName1="";
    this.stndrdName1=SIUtil.changeTo(lStndrdName1.trim(),this.encode);
  }
  
  //setter of 規格コード2
  public void setStndrdCodeSel2(String lStndrdCodeSel2){
    if (SIUtil.isNull(lStndrdCodeSel2)) lStndrdCodeSel2="";
    this.stndrdCodeSel2=SIUtil.changeTo(lStndrdCodeSel2.trim(),this.encode);
  }
  
  //setter of 規格名2
  public void setStndrdName2(String lStndrdName2){
    if (SIUtil.isNull(lStndrdName2)) lStndrdName2="";
    this.stndrdName2=SIUtil.changeTo(lStndrdName2.trim(),this.encode);
  }
  
  //setter of SQL
  public void setSql(String lSql){
    if (SIUtil.isNull(lSql)) lSql="";
    this.sql=SIUtil.changeTo(lSql.trim(),this.encode);
  }
  
  //getter of ショップコード1
  public String getShopCode(){
    return this.shopCode;
  }
  
  //getter of ショップコード1
  public String getCmdtyCode(){
    return this.cmdtyCode;
  }
  
  //getter of 商品名
  public String getCmdtyName(){
    return this.cmdtyName;
  }
  
  //getter of 規格コード1
  public String getStndrdCodeSel1(){
    return this.stndrdCodeSel1;
  }
  
  //getter of 規格名1
  public String getStndrdName1(){
    return this.stndrdName1;
  }
  
  //getter of 規格コード2
  public String getStndrdCodeSel2(){
    return this.stndrdCodeSel2;
  }
  
  //getter of 規格名2
  public String getStndrdName2(){
    return this.stndrdName2;
  }
  
  //getter of SQL
  public String getSql(){
    return this.sql;
  }
  
  /**
   * <b>reset</b>
   * 最初の状態を戻します。
   * @param lRequest  クライアントからリクエスト
   * @param lConnection データベースへのコネンクション
   * @param lUrlParam
   * @return なし
   * @throws なし
   */
  public void reset(HttpServletRequest lRequest,Connection lConnection,SIURLParameter lUrlParam){//7.1.1 ST0236 修正
    //前画面からのデータを取得して設定します。
    init(lRequest,lConnection,false,lUrlParam);//7.1.1 ST0236 修正
    
    StringBuffer lSqlBuf=new StringBuffer();
    lSqlBuf.append("SELECT DISTINCT StndrdCode1,StndrdCode2 FROM CmdtyStndrdMTbl ");
    lSqlBuf.append("WHERE ShopCode="+SIDBUtil.SQL2Str(this.shopCode," "));
    lSqlBuf.append("AND CmdtyCode="+SIDBUtil.SQL2Str(this.cmdtyCode," "));
    log.debug("reset:lSqlBuf="+lSqlBuf.toString());
    
    try {
      HashMap lResultMap=SIDBUtil.getOneRowData(lConnection,lSqlBuf.toString());
      if (lResultMap==null) return;
      this.setStndrdCodeSel1((String)lResultMap.get("stndrdcode1"));
      this.setStndrdCodeSel2((String)lResultMap.get("stndrdcode2"));
    } catch (SIDBAccessException e) {
      e.printStackTrace();
    }
    this.setSql(SICmdtyStndrdUtil.makeCmdtyStndrdSQL(shopCode,cmdtyCode,stndrdCodeSel1,stndrdCodeSel2));
    
    //規格名の設定
    setStndrdName(lConnection);
  }
  
  /**
   * <b>init</b>
   * 画面からのデータを取得して設定します。
   * @param lRequest  クライアントからリクエスト
   * @param lUrlParam
   * @return なし
   * @throws なし
   */
  //7.1.1 ST0236 修正 ここから
  public void init(HttpServletRequest lRequest,SIURLParameter lUrlParam){
    init(lRequest,null,false,lUrlParam);
  }
  //7.1.1 ST0236 修正 ここまで
  
  /**
   * <b>init</b>
   * 画面からのデータを取得して設定します。
   * @param lRequest  クライアントからリクエスト
   * @param lConnection データベースへのコネンクション
   * @param lUrlParam
   * @return なし
   * @throws なし
   */
  
  //7.1.1 ST0236 修正 ここから
  public void init(HttpServletRequest lRequest,Connection lConnection,SIURLParameter lUrlParam){
    init(lRequest,lConnection,true,lUrlParam);
  }
  //7.1.1 ST0236 修正 ここまで
  
  /**
   * <b>init</b>
   * 画面からのデータを取得して設定します。
   * @param lRequest  クライアントからリクエスト
   * @param lConnection データベースへのコネンクション
   * @param stndrdNameSetFlg
   * @param lUrlParam
   * @return なし
   * @throws なし
   */
  private void init(HttpServletRequest lRequest,Connection lConnection,boolean stndrdNameSetFlg,SIURLParameter lUrlParam){//7.1.1 ST0236 修正
    SILogin lLogin=SIHTMLUtil.getLogin(lRequest);
    
    this.setEncode(SIConfig.SIENCODE_SHIFT_JIS);
    if (lLogin.isShop()){
      this.setShopCode(lLogin.getMallShopCode());
    }else{
      this.setShopCode((String)lUrlParam.getParam("shopCode"));//7.1.1 ST0236 修正
    }
    //7.1.1 ST0236 修正ここから
    this.setCmdtyCode((String)lUrlParam.getParam("cmdtyCode"));
    this.setStndrdCodeSel1((String)lUrlParam.getParam("stndrdCodeSel1"));
    this.setStndrdCodeSel2((String)lUrlParam.getParam("stndrdCodeSel2"));
    this.setCmdtyName((String)lUrlParam.getParam("cmdtyName"));
    this.setActionNameTxt((String)lUrlParam.getParam("actionNameTxt"));
    //7.1.1 ST0236 修正ここまで
    StringBuffer lCmdtyNameBuf=new StringBuffer();
    
    try {
      
      this.setEncode(SIConfig.SIENCODE_NONE);
      lCmdtyNameBuf=new StringBuffer();
      if (SIUtil.isNull(this.getCmdtyName())){
        //商品
        lCmdtyNameBuf.append("SELECT CmdtyName FROM CmdtyMTBl " );
        lCmdtyNameBuf.append("WHERE ShopCode="+SIDBUtil.SQL2Str(this.getShopCode()," "));
        lCmdtyNameBuf.append("AND   CmdtyCode="+SIDBUtil.SQL2Str(this.getCmdtyCode()," "));
        this.setCmdtyName(SIDBUtil.getFirstData(lConnection,lCmdtyNameBuf.toString()));
      }
    } catch (SIDBAccessException e) {
      e.printStackTrace();
      this.setCmdtyName("");
    }
    
    //規格名の設定
    if (stndrdNameSetFlg) setStndrdName(lConnection);
  }
  
  /**
   * <b>validate</b>
   * 画面から選択した規格データをチェックします。
   * @param lRequest  クライアントからリクエスト
   * @return なし
   * @throws なし
   */
  public void validate(HttpServletRequest lRequest){
    SICustomErrors errors=new SICustomErrors();
    
    SICheckValid.checkValid(errors,"「規格1」または「規格2」",this.getStndrdCodeSel1()+this.getStndrdCodeSel2(),SICheckDataConf.SICHECK_DATA_EMPTY_TYPE);
    log.debug("validate:getStndrdCodeSel1="+getStndrdCodeSel1()+",getStndrdCodeSel2="+getStndrdCodeSel2());
    
    if ((SIUtil.isNotNull(this.getStndrdCodeSel1())||(SIUtil.isNotNull(this.getStndrdCodeSel2())))
        && this.getStndrdCodeSel1().equalsIgnoreCase(this.getStndrdCodeSel2())){
      errors.addError(new SICustomError("manager.app.data.notsame","規格1","規格2"));
    }
    
    lRequest.removeAttribute(SIConfig.SIERROR_ATTRIBUTE_MESSAGE_KEY);
    if (!errors.isEmpty()){
      lRequest.setAttribute(SIConfig.SIERROR_ATTRIBUTE_MESSAGE_KEY,errors);
    }else{
      this.setSql(SICmdtyStndrdUtil.makeCmdtyStndrdSQL(shopCode,cmdtyCode,stndrdCodeSel1,stndrdCodeSel2));
    }
  }
  
  /**
   * <b>getConnection</b>
   * matrixのデータを生成します。
   * @param lConnection データベースへのコネンクション
   * @return なし
   * @throws なし
   */
  public Collection getCollection(Connection lConnection){
    String lSql=this.getSql();
    log.debug("getCollection:lSql="+lSql);
    
    if (SIUtil.isNull(lSql)) return new ArrayList();//規格がない
    
    Statement lStatement=null;
    ResultSet lResultSet=null;
    CallableStatement cstmt=null;
    
    SICmdtyStndrd lCmdtyStndrd=new SICmdtyStndrd();
    
    if (SIUtil.isNull(lSql))return new ArrayList();
    Collection lCmdtyStndrdes=new ArrayList();
    
    //実行
    try {
      if (SIDBMultiConf.SIDB_CURRENT_INX ==SIDBMultiConf.SIDB_POSTGRESQL_INX){
        lStatement=lConnection.createStatement();
        lResultSet=lStatement.executeQuery(lSql);
      }else{
        cstmt = lConnection.prepareCall(lSql);
        cstmt.registerOutParameter(1,OracleTypes.CURSOR);
        cstmt.execute();
        lResultSet =(ResultSet)cstmt.getObject(1);
      }
      
      while (lResultSet.next()){
        lCmdtyStndrd=new SICmdtyStndrd();
        lCmdtyStndrd.setEncode(SIConfig.SIENCODE_NONE);
        lCmdtyStndrd.setShopCode(lResultSet.getString("SHOPCODE"));
        lCmdtyStndrd.setCmdtyCode(lResultSet.getString("CmdtyCode"));
        lCmdtyStndrd.setCmdtyStndrdCode(lResultSet.getString("CmdtyStndrdCode"));
        lCmdtyStndrd.setStndrdCode1(lResultSet.getString("StndrdCode1"));
        lCmdtyStndrd.setElementCode1(lResultSet.getString("ElementCode1"));
        lCmdtyStndrd.setElementName1(lResultSet.getString("ElementName1"));
        lCmdtyStndrd.setStndrdCode2(lResultSet.getString("StndrdCode2"));
        lCmdtyStndrd.setElementCode2(lResultSet.getString("ElementCode2"));
        lCmdtyStndrd.setElementName2(lResultSet.getString("ElementName2"));
        lCmdtyStndrd.setAmount(lResultSet.getString("Amount"));
        
        lCmdtyStndrdes.add(lCmdtyStndrd);
      }
    } catch (SQLException e) {
      e.printStackTrace();
      return new ArrayList();
    }finally{
      if (cstmt!=null)try{cstmt.close();}catch(SQLException sqle){}
      SIDBUtil.close(lResultSet,lStatement);
    }
    
    return lCmdtyStndrdes;
  }

  /**
   * <b>setStndrdName</b>
   * 規格コード1と規格コード2に基づいて、規格名を設定します。
   * @param lConnection データベースへのコネンクション
   * @return なし
   * @throws なし
   */
  private void setStndrdName(Connection lConnection){
    StringBuffer lCmdtyNameBuf=new StringBuffer();

    //規格名1の設定
    lCmdtyNameBuf=new StringBuffer();
    if (SIUtil.isNotNull(stndrdCodeSel1)){
      lCmdtyNameBuf.append("SELECT StndrdName FROM StndrdNameMTbl " );
      lCmdtyNameBuf.append("WHERE ShopCode="+SIDBUtil.SQL2Str(this.getShopCode()," "));
      lCmdtyNameBuf.append("AND StndrdCode="+SIDBUtil.SQL2Str(this.getStndrdCodeSel1()," "));
      try {
        this.setStndrdName1(SIDBUtil.getFirstData(lConnection,lCmdtyNameBuf.toString()));
      } catch (SIDBAccessException e) {
        e.printStackTrace();
      }
    }
    
    //規格名2の設定
    lCmdtyNameBuf=new StringBuffer();
    if (SIUtil.isNotNull(stndrdCodeSel2)){
      lCmdtyNameBuf.append("SELECT StndrdName FROM StndrdNameMTbl " );
      lCmdtyNameBuf.append("WHERE ShopCode="+SIDBUtil.SQL2Str(this.getShopCode()," "));
      lCmdtyNameBuf.append("AND   StndrdCode="+SIDBUtil.SQL2Str(this.getStndrdCodeSel2()," "));
      try {
        this.setStndrdName2(SIDBUtil.getFirstData(lConnection,lCmdtyNameBuf.toString()));
      } catch (SIDBAccessException e) {
        e.printStackTrace();
      }
    }
  }
  
  /**
   * <b>getConnection</b>
   * matrixのデータを生成します。
   * @param lConnection データベースへのコネンクション
   * @return なし
   * @throws なし
   */
  public Collection getCurrentStndrdCollection(Connection lConnection,String ShopCode,String CmdtyCode){
    Collection lCmdtyStndrdes=new ArrayList();
    Statement lStatement = null;
    ResultSet lResultSet = null;
    try {
      //削除前のデータを保持
      String str = "SELECT * FROM CmdtyStndrdMTbl "
             + "WHERE ShopCode="+SIDBUtil.SQL2Str(ShopCode," ")
             + "AND CmdtyCode="+SIDBUtil.SQL2Str(CmdtyCode," ");
      
      lStatement = lConnection.createStatement();
      lResultSet=lStatement.executeQuery(str);
      while (lResultSet.next()){
        SICmdtyStndrd lCmdtyStndrd=new SICmdtyStndrd();
        lCmdtyStndrd.setEncode(SIConfig.SIENCODE_NONE);
        lCmdtyStndrd.setStndrdCode1(lResultSet.getString("StndrdCode1"));
        lCmdtyStndrd.setElementCode1(lResultSet.getString("ElementCode1"));
        lCmdtyStndrd.setStndrdCode2(lResultSet.getString("StndrdCode2"));
        lCmdtyStndrd.setElementCode2(lResultSet.getString("ElementCode2"));
        lCmdtyStndrdes.add(lCmdtyStndrd);
      }
    } catch (SQLException e) {
        e.printStackTrace();
        return new ArrayList();
    }finally{
      SIDBUtil.close(lResultSet,lStatement);
    }
    return lCmdtyStndrdes;
  }
}
