/**
 * Copyright (c) 2003-2004 System Integrator Corporation.
 *                 All Rights Reserved.
 */
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.SICmdtyCtgry;
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.SIUtil;
import jp.co.sint.tools.SIURLParameter;//7.1.1 ST0236 追加

import org.apache.log4j.Category;

/**
 * @version $Id: UICmdtyCtgryListCond.java,v 1.0 2003/09/22 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/09/22 10:47:59  Original
 */
public class UICmdtyCtgryListCond extends SIBasic{
  //ログ用のインスタンスの生成
  private static Category log=Category.getInstance(SIConfig.SILOG4J_WEBSHOP_CATEGORY_NAME);
  
  //ショップコード
  private String shopCode="";
  
  //商品コード
  private String cmdtyCode="";
  
  //商品コード
  private String cmdtyName="";
  
  //カテゴリコード
  private String ctgryCode=SIConfig.SICATEGORY_ROOT_CODE ;
  
  //登録されるカテゴリコードのリスト
  private String[] ctgryCodeChk=new String[0];
  
  public UICmdtyCtgryListCond(){}
  
  //setter of ショップコード
  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 カテゴリコード
  public void setCtgryCode(String lCtgryCode){
    if (SIUtil.isNull(lCtgryCode)) lCtgryCode=SIConfig.SICATEGORY_ROOT_CODE ;
    this.ctgryCode=SIUtil.changeTo(lCtgryCode.trim(),this.encode);
  }
  
  public void setCtgryCodeChk(String[] lCtgryCodeChk){
    if (lCtgryCodeChk==null) lCtgryCodeChk=new String[0];
    ctgryCodeChk=lCtgryCodeChk;
  }
  
  //setter of ページ番号
  public void setPageNumberTxt(String lPageNumberTxt){
    if (SIUtil.isNull(lPageNumberTxt))lPageNumberTxt="1";
    this.pageNumberTxt=lPageNumberTxt;
  }
  
  //setter of ページごとに表示するレコード数
  public void setPageNumberSel(String lPageNumberSel){
    if (SIUtil.isNull(lPageNumberSel))lPageNumberSel="1";
    this.pageNumberSel=lPageNumberSel;
  }
  
  //getter of ショップコード
  public String getShopCode(){
    return this.shopCode;
  }
  
  //getter of 商品コード
  public String getCmdtyCode(){
    return this.cmdtyCode;
  }
  
  //getter of 商品名
  public String getCmdtyName(){
    return this.cmdtyName;
  }
  
  //getter of カテゴリコード
  public String getCtgryCode(){
    return this.ctgryCode;
  }
  
  public String[] getCtgryCodeChk(){
    return this.ctgryCodeChk;
  }
  
  //getter of ページ番号
  public String getPageNumberTxt(){
    return this.pageNumberTxt;
  }
  
  //getter of ページごとに表示するレコード数
  public String getPageNumberSel(){
    return this.pageNumberSel;
  }
  
  /**
   * <b>init</b>
   * 該当商品レコードに関わる各パラメータデータを取得して設定します。
   * @param request クライアントからリクエスト
   * @param lConnection ＤＢへのコネンクション
   * @param lUrlParam
   * @return なし
   * @throws なし
   */
  public void init(HttpServletRequest lRequest,Connection lConnection,SIURLParameter lUrlParam){//7.1.1 ST0236 修正
    init(lRequest,lUrlParam);//7.1.1 ST0236 修正
    
    this.setEncode(SIConfig.SIENCODE_NONE);
    
    StringBuffer lSqlBuf=new StringBuffer();
    lSqlBuf.append("SELECT CmdtyName FROM CmdtyVW ");
    lSqlBuf.append("WHERE ShopCode="+SIDBUtil.SQL2Str(getShopCode()," "));
    lSqlBuf.append("AND   CmdtyCode="+SIDBUtil.SQL2Str(getCmdtyCode()," "));
    
    try {
      this.setCmdtyName(SIDBUtil.getFirstData(lConnection,lSqlBuf.toString()));
    } catch (SIDBAccessException e) {
      e.printStackTrace();
    }
  }
  
  /**
   * <b>initReg</b>
   * 該当商品レコードを削除＆新規登録する場合には、必要なパラメータデータを取得して、設定します。
   * @param request クライアントからリクエスト
   * @param lUrlParam
   * @return なし
   * @throws なし
   */
  //7.1.1 ST0236 修正 ここから
  public void init(HttpServletRequest lRequest,SIURLParameter lUrlParam){
    this.setEncode(SIConfig.SIENCODE_SHIFT_JIS);
    this.setShopCode((String)lUrlParam.getParam("shopCode"));//ショップコード
    this.setCmdtyCode((String)lUrlParam.getParam("cmdtyCode"));//商品コード
    this.setCtgryCode((String)lUrlParam.getParam("ctgryCode"));//カテゴリコード
    this.setCtgryCodeChk(lRequest.getParameterValues("ctgryCodeChk"));//カテゴリコードリスト
  }
  //7.1.1 ST0236 修正 ここまで
  
  /**
   * <b>getCollection</b>
   * 条件に合ったレコードを検索して、結果のコネクションを作成して、戻します。
   * @param lConnection データベースへの接続コネクション
   * @return レコードのセット
   * @throws なし
   */
  public Collection getCollection(Connection lConnection) throws SIDBAccessException{
    Statement lStatement=null;
    ResultSet lResultSet=null;
    SICmdtyCtgry lCmdtyCtgry=new SICmdtyCtgry();
    StringBuffer lSqlBuf=new StringBuffer();
    Collection lCmdtyCtgries=new ArrayList();
    //カテゴリ名編集用
    String lCtgryName="";
    
    //基本のSQL
    lSqlBuf.append("SELECT aa.*,bb.CtgryName,bb.Branch,cc.CmdtyName ");
    lSqlBuf.append("FROM CmdtyCtgryMTbl aa,");
    lSqlBuf.append("CtgryNameVW bb,");
    lSqlBuf.append("CmdtyMTbl cc ");
    //検索の条件
    lSqlBuf.append("WHERE aa.ShopCode="+SIDBUtil.SQL2Str(shopCode," "));
    lSqlBuf.append("AND aa.CmdtyCode="+SIDBUtil.SQL2Str(cmdtyCode," "));
    lSqlBuf.append("AND aa.ShopCode=cc.ShopCode ");
    lSqlBuf.append("AND aa.CmdtyCode=cc.CmdtyCode ");
    lSqlBuf.append("AND aa.CtgryCode=bb.CtgryCode ");
    //出力順
    lSqlBuf.append("ORDER BY bb.abbvCtgryName ");
    log.debug("sqlStatement="+lSqlBuf.toString());
    //実行
    try{
    lStatement=lConnection.createStatement();
    lResultSet=lStatement.executeQuery(lSqlBuf.toString());
    
    //商品レコードのセットの作成
    while (lResultSet.next()){
      lCmdtyCtgry=new SICmdtyCtgry();
      lCmdtyCtgry.setEncode(SIConfig.SIENCODE_NONE);
      lCmdtyCtgry.setShopCode(lResultSet.getString("ShopCode"));
      lCmdtyCtgry.setCmdtyCode(lResultSet.getString("CmdtyCode"));
      lCmdtyCtgry.setCmdtyName(lResultSet.getString("CmdtyName"));
      lCmdtyCtgry.setCtgryCode(lResultSet.getString("CtgryCode"));
      //カテゴリ名を編集
      lCtgryName = getCtgryName(lResultSet.getString("Branch").trim(), lConnection);
      lCmdtyCtgry.setCtgryName(lCtgryName);
      lCmdtyCtgries.add(lCmdtyCtgry);
    }
    }catch(Exception ex){
    throw new SIDBAccessException(ex);
    }finally{
    SIDBUtil.close(lResultSet,lStatement);
    }
    return lCmdtyCtgries;
  }

  /**
   * <b>getCtgryName</b>
   * トップからのカテゴリ名を順にセットし、戻します。
   * @param lBranch CmdtyCtgryVwのBranch,lConnection データベースへの接続コネクション
   * @return String
   * @throws なし
   */
  public String getCtgryName(String lBranch, Connection lConnection) throws SIDBAccessException{
    Statement lStatement=null;
    ResultSet lResultSet=null;
    StringBuffer lSqlBuf=new StringBuffer();
    String lCtgryName="";
    
    char content[] = new char[lBranch.length()];
    lBranch.getChars(0,lBranch.length(),content,0);
    int cnt=0;
    //カテゴリ階層数
    for(int j=0;j< content.length; j++){
      if(content[j] == '~' ) cnt++;
    }
    
    String[] split_branch = new String[cnt+1];
    StringBuffer result = new StringBuffer(content.length);
    //取得しBranchを~ごとに分解してセットしていく
    int j=0;
    for(int k=0;k< content.length; k++){
      if(content[k] !='~'){
//        split_branch[j].concat(new Character(content[k]).toString());
        result.append(content[k]);
      }else{
        if(k==0) continue;
        split_branch[j++] = result.toString();
        result.delete(0,result.length());
      }
    }
    //最終文字列用
    if(result.length()!=0) split_branch[j] = result.toString();
    
    for(int i=0; i<split_branch.length;i++){
      
      //基本のSQL
      lSqlBuf.append("SELECT aa.CtgryName FROM CtgryMTbl aa");
      //検索の条件
      lSqlBuf.append(" WHERE aa.CtgryCode=").append(SIDBUtil.SQL2Str(split_branch[i]));
      log.debug("sqlStatement="+lSqlBuf.toString());
      //実行
      try{
        lStatement=lConnection.createStatement();
        lResultSet=lStatement.executeQuery(lSqlBuf.toString());
        
        //商品レコードのセットの作成
        while (lResultSet.next()){
          if(lCtgryName.equals("")){
            lCtgryName =  lResultSet.getString("CtgryName") ;
          }else{
            lCtgryName +=  " > " + lResultSet.getString("CtgryName") ;
          }
        }
      }catch(Exception ex){
        throw new SIDBAccessException(ex);
      }finally{
        //リセット
        lSqlBuf.delete(0,lSqlBuf.length());
        result.delete(0,result.length());
        SIDBUtil.close(lResultSet,lStatement);
      }
    }
    return lCtgryName;
  }
}