package jp.co.sint.beans.mallmgr;

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

import javax.servlet.http.HttpServletRequest;

import jp.co.sint.basic.SIBasic;
import jp.co.sint.beans.front.UICmdtyRanking;
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;

import org.apache.log4j.Category;

public class UIBGRanking extends SIBasic {
  //ログ用のインスタンスの生成
  private static Category log = Category.getInstance(SIConfig.SILOG4J_WEBSHOP_CATEGORY_NAME);
  
  //ヘッダ
  private String header = "";
  //親コード
  private String cmdtyCode = "";
  //在庫コード
  private String individualCode = "";
  //販売台数
  private String numberOfSales = "";
  //コメント
  private String comment ="";
  
  private int rankingIndex = 1;
  
  public int getRankingIndex() {
    return rankingIndex;
  }
  
  public void setRankingIndex(int rankingIndex) {
    this.rankingIndex = rankingIndex;
  }
  
  /*
   * getter of 親コード
   */
  public String getCmdtyCode() {
    return cmdtyCode;
  }
  /*
   * setter of 親コード
   */
  public void setCmdtyCode(String cmdtyCode) {
    this.cmdtyCode = cmdtyCode;
  }
  /*
   * getter of コメント
   */
  public String getComment() {
    return comment;
  }
  /*
   * setter of コメント
   */
  public void setComment(String comment) {
    this.comment = comment;
  }
  /*
   * getter of ヘッダー
   */
  public String getHeader() {
    return header;
  }
  /*
   * setter of ヘッダー
   */
  public void setHeader(String header) {
    this.header = header;
  }
  /*
   * getter of 在庫コード
   */
  public String getIndividualCode() {
    return individualCode;
  }
  /*
   * setter of 在庫コード
   */
  public void setIndividualCode(String individualCode) {
    this.individualCode = individualCode;
  }
  /*
   * getter of 販売台数
   */
  public String getNumberOfSales() {
    return numberOfSales;
  }
  /*
   * setter of 販売台数
   */
  public void setNumberOfSales(String numberForSales) {
    this.numberOfSales = numberForSales;
  }
  
  /**
   * <b>init</b>
   * 入力したデータを基づいて、このbeansを設定します。
   * @param request クライアントからリクエスト
   * @param lUrlParam
   * @return なし
   * @throws なし
   */
  public void init(HttpServletRequest lRequest,SIURLParameter lUrlParam){
    this.header=((String)lUrlParam.getParam("header"));
    this.cmdtyCode=((String)lUrlParam.getParam("cmdtyCode"));
    this.individualCode=((String)lUrlParam.getParam("individualCode"));
    this.numberOfSales=((String)lUrlParam.getParam("numberOfSales"));
    this.comment=((String)lUrlParam.getParam("comment"));
  }
  public void initR(SIURLParameter lUrlParam){
    this.setRankingIndex(Integer.parseInt((String)lUrlParam.getParam("inx")));
  }
  
  public boolean validate(HttpServletRequest req,Connection con){
    
    req.removeAttribute(SIConfig.SIERROR_ATTRIBUTE_MESSAGE_KEY);
    SICustomErrors errors=new SICustomErrors();
    StringBuffer lSqlBuf=new StringBuffer("");
    
    StringTokenizer cmdtyToken = new StringTokenizer(this.cmdtyCode,"\r\n");
    StringTokenizer individualToken = new StringTokenizer(this.individualCode,"\r\n");
    StringTokenizer numberOfSalesToken = new StringTokenizer(this.numberOfSales,"\r\n");
    StringTokenizer commentToken = new StringTokenizer(this.comment,"\r\n");
    
    if(cmdtyToken.countTokens()!=20||individualToken.countTokens()!=20||numberOfSalesToken.countTokens()!=20||commentToken.countTokens()!=20){
      errors.addError((new SICustomError("manager.message.error.bgranking")));
      if (!errors.isEmpty()) req.setAttribute(SIConfig.SIERROR_ATTRIBUTE_MESSAGE_KEY,errors);
      return errors.isEmpty();
    }
    String strCmdtyCode[] = new String[20];
    String strIndividualCode[] = new String[20];
    String strNumberOfSales[] = new String[20];
    String strComment[] = new String[20];
    int cnt=0;
    
    while(cmdtyToken.hasMoreTokens()) {
      strCmdtyCode[cnt]=cmdtyToken.nextToken();
      SICheckValid.checkValid(errors,"親コード",strCmdtyCode[cnt],SICheckDataConf.SICHECK_DATA_ALPHA_DIGIT_TYPE);
      SICheckValid.checkValid(errors,"親コード",strCmdtyCode[cnt],SICheckDataConf.SICHECK_DATA_BYTE_LEN_WITHIN_TYPE,13);
      cnt++;
    }
    cnt=0;
    while(individualToken.hasMoreTokens()) {
      strIndividualCode[cnt]=individualToken.nextToken();
      SICheckValid.checkValid(errors,"在庫コード",strIndividualCode[cnt],SICheckDataConf.SICHECK_DATA_ALPHA_DIGIT_TYPE);
      SICheckValid.checkValid(errors,"在庫コード",strIndividualCode[cnt],SICheckDataConf.SICHECK_DATA_BYTE_LEN_WITHIN_TYPE,8);
      cnt++;
    }
    cnt=0;
    while(numberOfSalesToken.hasMoreTokens()) {
      strNumberOfSales[cnt]=numberOfSalesToken.nextToken();
      SICheckValid.checkValid(errors,"販売台数",strNumberOfSales[cnt],SICheckDataConf.SICHECK_DATA_DIGIT_TYPE);
      SICheckValid.checkValid(errors,"販売台数",strNumberOfSales[cnt],SICheckDataConf.SICHECK_DATA_BYTE_LEN_WITHIN_TYPE,6);
      cnt++;
    }
    cnt=0;
    while(commentToken.hasMoreTokens()) {
      strComment[cnt]=commentToken.nextToken();
      SICheckValid.checkValid(errors,"コメント",strNumberOfSales[cnt],SICheckDataConf.SICHECK_DATA_BYTE_LEN_WITHIN_TYPE,60);
      cnt++;
    }
    
    for(int i=0;i<20;i++){
      lSqlBuf=new StringBuffer();
      lSqlBuf.append("SELECT individualcode FROM individualtbl ");
      lSqlBuf.append("WHERE CmdtyCode="+SIDBUtil.SQL2Str(strCmdtyCode[i]," "));
      lSqlBuf.append("AND ShopCode="+SIDBUtil.SQL2Str("0"," "));
      lSqlBuf.append("AND individualcode="+SIDBUtil.SQL2Str(strIndividualCode[i]," "));
      SICheckValid.checkExist(errors,con,"商品"+Integer.toString(i+1),lSqlBuf.toString());
    }
    
    if (!errors.isEmpty()) req.setAttribute(SIConfig.SIERROR_ATTRIBUTE_MESSAGE_KEY,errors);
    return errors.isEmpty();
  }
  
  /**
   * <b>getData</b>
   * DBより現在のランキングを取得
   * @param con
   * @throws SIDBAccessException
   */
  public void getData(Connection con) throws SIDBAccessException{
    Statement lStatement = null;
    ResultSet lResultSet = null;
    String sql = "select * from bgrankingtbl";
    try {
      log.debug("getBranchStockTxt:lSqlBuf=" + sql);
      lStatement = con.createStatement();
      lResultSet = lStatement.executeQuery(sql);
      
      while (lResultSet.next()) {
        if(lResultSet.getString("rank").equals("0")){
          this.header=lResultSet.getString("comment");
        }else{
          this.cmdtyCode=this.cmdtyCode+lResultSet.getString("cmdtyCode")+"\r\n";
          this.individualCode=this.individualCode+lResultSet.getString("individualCode")+"\r\n";
          this.numberOfSales=this.numberOfSales+lResultSet.getString("numberOfSales")+"\r\n";
          this.comment=this.comment+lResultSet.getString("comment")+"\r\n";
        }
      }
      
    } catch (Exception ex) {
      throw new SIDBAccessException(ex);
    } finally {
      SIDBUtil.close(lResultSet, lStatement);
    }
  }
  
  public Collection getRankingCollection(Connection lConnection,HttpServletRequest lRequest) {
    return UICmdtyRanking.getRankingCollection(lConnection, lRequest, this.rankingIndex, 20);
  }
  
  public String getRankingTitle(){
    return UICmdtyRanking.getRankingTitle(this.rankingIndex);
  }
  
  public String getRankingTitle(int inx){
    return UICmdtyRanking.getRankingTitle(inx);
  }
  
  public int getRankingListCount() {
    return UICmdtyRanking.rankingListCount;
  }
}

