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

import java.sql.Connection;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;

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 org.apache.log4j.Category;

/**
 * @version $Id: SIConstructCmdtyStndrd.java,v 1.0 2003/09/17 Exp $
 * @author  Jinwang Chen
 * <br>Description: 商品規格画面に使われるutilities
 * <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/17 17:27:23  Original
 */
public class SICmdtyStndrdUtil {
  
  private static Category log=Category.getInstance(SIConfig.SILOG4J_WEBSHOP_CATEGORY_NAME);
  
  //商品規格登録画面にチェック名
  private String checkBoxName="";
  private String checkBoxVal="";
  private String amountName="";
  private String amountVal="";
  private String imageFileName="";
  private String imageFileVal="";
  
  /**
   * SICmdtyStndrdUtil
   * コンストラクタ
   * @param なし
   * @return なし
   * @throws なし
   */
  public SICmdtyStndrdUtil(){}
  
  /**
   * SICmdtyStndrdUtil
   * コンストラクタ
   * @param lComplexName チェック名、または、在庫数両名、また、画像ファイル名
   * @return なし
   * @throws なし
   */
  public SICmdtyStndrdUtil(String lComplexName){
    String lBasic="";
    String[] lSplitCode=new String[0];
    if (lComplexName.startsWith(SIConfig.SIPREFIX_CHECKBOX_NAME_TEXT)){
      lBasic=lComplexName.substring(SIConfig.SIPREFIX_CHECKBOX_NAME_TEXT.length());
    }else if (lComplexName.startsWith(SIConfig.SIPREFIX_AMOUNT_NAME_TEXT)){
      lBasic=lComplexName.substring(SIConfig.SIPREFIX_AMOUNT_NAME_TEXT.length());
    }else if (lComplexName.startsWith(SIConfig.SIPREFIX_CHECKBOX_NAME_TEXT)){
      lBasic=lComplexName.substring(SIConfig.SIPREFIX_CHECKBOX_NAME_TEXT.length());
    }
    
    if (SIUtil.isNotNull(lBasic)){
      checkBoxName=SIConfig.SIPREFIX_CHECKBOX_NAME_TEXT+lBasic;
      amountName=SIConfig.SIPREFIX_AMOUNT_NAME_TEXT+lBasic;
      imageFileName=SIConfig.SIPREFIX_IMAGE_FILE_NAME_TEXT+lBasic;
    }
  }
  
  /**
   * SICmdtyStndrdUtil
   * コンストラクタ
   * @param lStndrdCode1 規格コード1
   * @param lElementCode1 エレメント名1
   * @param lStndrdCode2 規格コード2
   * @param lElementCode2 エレメント名2
   * @return なし
   * @throws なし
   */
  public SICmdtyStndrdUtil(String lStndrdCode1,String lElementCode1,String lStndrdCode2,String lElementCode2){
    String lBasic=lStndrdCode1+SIConfig.SIWEBSHOPPING_TOKEN+lElementCode1+SIConfig.SIWEBSHOPPING_TOKEN+lStndrdCode2+SIConfig.SIWEBSHOPPING_TOKEN+lElementCode2;
    checkBoxName=SIConfig.SIPREFIX_CHECKBOX_NAME_TEXT+lBasic;
    amountName=SIConfig.SIPREFIX_AMOUNT_NAME_TEXT+lBasic;
    imageFileName=SIConfig.SIPREFIX_IMAGE_FILE_NAME_TEXT+lBasic;
  }
  
  /**
   * getCheckBoxVal
   * チェックの部分の名を取得します。
   * @param なし
   * @return なし
   * @throws なし
   */
  public String getCheckBoxName(){
    return this.checkBoxName;
  }
  
  /**
   * getCheckBoxVal
   * チェックの部分の値を取得します。
   * @param lMap 値セットマップ
   * @return なし
   * @throws なし
   */
  public String getCheckBoxVal(HashMap lMap){
    return (String)lMap.get(this.checkBoxName);
  }
  
  /**
   * getAmountName
   * 在庫数量名を取得します。
   * @param なし
   * @return なし
   * @throws なし
   */
  public String getAmountName(){
    return this.amountName;
  }
  
  /**
   * getAmountVal
   * 在庫数量の値を取得します。
   * @param lMap 値セットマップ
   * @return なし
   * @throws なし
   */
  public String getAmountVal(HashMap lMap){
    return (String)lMap.get(this.amountName);
  }
  
  /**
   * getImageFileName
   * 画像ファイル名を取得します。
   * param なし
   * @return なし
   * @throws なし
   */
  public String getImageFileName(){
    return this.imageFileName;
  }
  
  /**
   * getImageFileVal
   * 画像ファイルの値を取得します。
   * @param lMap 値セットマップ
   * @return なし
   * @throws なし
   */
  public String getImageFileVal(HashMap lMap){
    return (String)lMap.get(this.imageFileName);
  }
  
  /**
   * <b>makeCmdtyStndrdSQL</b>
   * matrixのデータを生成します。
   * @param lConnection データベースへのコネンクション
   * @return なし
   * @throws なし
   */
  public static String makeCmdtyStndrdSQL(String lShopCode,String lCmdtyCode,String lStndrdCode1,String lStndrdCode2){
    if (SIUtil.isNull(lStndrdCode1)&&SIUtil.isNull(lStndrdCode2)) return "";
    
    StringBuffer lResultBuf=new StringBuffer();
    
    if (SIDBMultiConf.SIDB_CURRENT_INX ==SIDBMultiConf.SIDB_POSTGRESQL_INX){
      lResultBuf.append("SELECT * FROM CmdtyStndrdFunc(");
      lResultBuf.append(SIDBUtil.Func2Str(lShopCode,","));
      lResultBuf.append(SIDBUtil.Func2Str(lCmdtyCode,","));
      lResultBuf.append(SIDBUtil.Func2Str(lStndrdCode1,","));
      lResultBuf.append(SIDBUtil.Func2Str(lStndrdCode2,")"));
    }else{
      lResultBuf.append("{CALL CmdtyStndrd.CmdtyStndrdProc('").append(lShopCode).append("',");
      lResultBuf.append("'").append(lCmdtyCode).append("',");
      lResultBuf.append("'").append(lStndrdCode1).append("',");
      lResultBuf.append("'").append(lStndrdCode2).append("',?)}");
    }
    return lResultBuf.toString();
  }
  
  /**
   * <b>getStndrdNameColl</b>
   * 該当ショップコードに対する全ての有効な規格コードを取得します。
   * @param lConnection データベースへのコネンクション
   * @param lShopCode ショップコード
   * @return 有効な規格コードのセット
   * @throws なし
   */
  public static Collection getStndrdNameColl(Connection lConnection,String lShopCode){
    StringBuffer lResultBuf=new StringBuffer();
    lResultBuf.append("SELECT a.stndrdName,a.stndrdCode ");
    lResultBuf.append("FROM StndrdNameMTbl a ");
    lResultBuf.append("WHERE a.ShopCode="+SIDBUtil.SQL2Str(lShopCode));
    lResultBuf.append("AND EXISTS (");
    lResultBuf.append("SELECT ShopCode FROM StndrdContentMTbl ");
    lResultBuf.append("WHERE a.ShopCode=ShopCode AND a.StndrdCode=StndrdCode ");
    lResultBuf.append(")");
    
    try {
      Collection stndrdNameColl=SIDBUtil.getCollection(lConnection,lResultBuf.toString());
      return stndrdNameColl;
    } catch (SIDBAccessException e) {
      e.printStackTrace();
      return new ArrayList();
    }
  }
  
  public static String makeElementSQL(String lShopCode,String lCmdtyCode,int lInx,String lElementCode1){
    StringBuffer lSqlBuf=new StringBuffer();
    //element1に該当データが無い場合に,element2を表示させないようにする
    lSqlBuf.append("SELECT  ElementName,ElementCode FROM StndrdContentMTbl ");
    lSqlBuf.append("WHERE (ShopCode,StndrdCode,ElementCode) IN ");
    lSqlBuf.append("(SELECT ShopCode,StndrdCode"+lInx+",ElementCode"+lInx+" FROM CmdtyStndrdMTbl ");
    lSqlBuf.append("WHERE ShopCode="+SIDBUtil.SQL2Str(lShopCode," "));
    lSqlBuf.append("AND cmdtyCode="+SIDBUtil.SQL2Str(lCmdtyCode," "));
    if(!lElementCode1.equals("")) lSqlBuf.append("and elementcode1="+SIDBUtil.SQL2Str(lElementCode1," "));
    lSqlBuf.append(") ");
    lSqlBuf.append("ORDER BY DispOrder");
    return lSqlBuf.toString();
  }
  
  public static String makeElementSQL(String lShopCode,String lCmdtyCode,int lInx){
    StringBuffer lSqlBuf=new StringBuffer();
    lSqlBuf.append("SELECT  ElementName,ElementCode FROM StndrdContentMTbl ");
    lSqlBuf.append("WHERE (ShopCode,StndrdCode,ElementCode) IN (");
    lSqlBuf.append("SELECT DISTINCT ShopCode,StndrdCode"+lInx+",ElementCode"+lInx+" FROM CmdtyStndrdMTbl ");
    lSqlBuf.append("WHERE ShopCode="+SIDBUtil.SQL2Str(lShopCode," "));
    lSqlBuf.append("AND cmdtyCode="+SIDBUtil.SQL2Str(lCmdtyCode,") "));
    lSqlBuf.append("ORDER BY DispOrder");
    log.debug("makeElementSQL:lSqlBuf="+lSqlBuf.toString());
    return lSqlBuf.toString();
  }
  
  public static String makeResetSQL(String lShopCode,String lCmdtyCode,int lInx){
    String lCode="StndrdCode"+lInx;
    StringBuffer lSqlBuf=new StringBuffer();
    
    lSqlBuf.append("SELECT DISTINCT aa."+lCode+" AS StndrdCode,bb.StndrdName ");
    lSqlBuf.append("FROM CmdtyStndrdMTbl").append(SIDBMultiConf.SIALIAS_CURR_NAME).append("aa,");
    lSqlBuf.append("StndrdNameMTbl").append(SIDBMultiConf.SIALIAS_CURR_NAME).append("bb ");
    lSqlBuf.append("WHERE aa.ShopCode=bb.ShopCode AND aa."+lCode+"=bb.StndrdCode ");
    lSqlBuf.append("AND aa.ShopCode="+SIDBUtil.SQL2Str(lShopCode," "));
    lSqlBuf.append("AND aa.cmdtyCode="+SIDBUtil.SQL2Str(lCmdtyCode," "));
    log.debug("makeResetSQL:lSqlBuf="+lSqlBuf.toString());
    return lSqlBuf.toString();
  }
}