/**
 * Created on 2003/08/26
 *
 * To change the template for this generated file go to
 * Window>Preferences>Java>Code Generation>Code and Comments
 */
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.SINews;
import jp.co.sint.config.SIConfig;
import jp.co.sint.database.SIDBAccessException;
import jp.co.sint.database.SIDBUtil;
import jp.co.sint.database.SITableCondition;
import jp.co.sint.database.SITableConditionManager;
import jp.co.sint.tools.SICheckDataConf;
import jp.co.sint.tools.SICheckUtil;
import jp.co.sint.tools.SICheckValid;
import jp.co.sint.tools.SICustomError;
import jp.co.sint.tools.SICustomErrors;
import jp.co.sint.tools.SIDateTime;
import jp.co.sint.tools.SIStringUtil;
import jp.co.sint.tools.SIUtil;
import jp.co.sint.tools.SIURLParameter;//7.1.1 ST0236 追加

import org.apache.log4j.Category;

/**
 * @author arai
 *
 * To change the template for this generated type comment go to
 * Window>Preferences>Java>Code Generation>Code and Comments
 */
public class UINewsList extends SIBasic {

  //ログ用のインスタンスの生成
  private static Category log = Category.getInstance(SIConfig.SILOG4J_WEBSHOP_CATEGORY_NAME);
  
  private String newsCode = "";
  private String description = "";
  private String delFlag = "1"; //0:非表示 1:表示 2:一覧表示
  private String initDateTime = "";
  private String dispFlag = "0";
  
  private String newsFromDateYear;
  private String newsFromDateMonth;
  private String newsFromDateDay;
  private String newsFromDateHour;
  
  private String dispFlagTxt = "";
  
  public UINewsList() {
  }
  
  /**
   * init
   * 入力したデータから、このbeansを設定します。
   * @param lUrlParam
   * @return なし
   * @throws なし
   */
  //7.1.1 ST0236 修正 ここから
  public void init(SIURLParameter lUrlParam) {
    this.setEncode(SIConfig.SIENCODE_SHIFT_JIS);
    
    this.setNewsCode((String)lUrlParam.getParam("newsCode"));
    this.setDescription((String)lUrlParam.getParam("description"));
    this.setNewsFromDateYear((String)lUrlParam.getParam("newsFromDateYear"));
    this.setNewsFromDateMonth((String)lUrlParam.getParam("newsFromDateMonth"));
    this.setNewsFromDateDay((String)lUrlParam.getParam("newsFromDateDay"));
    this.setNewsFromDateHour((String)lUrlParam.getParam("newsFromDateHour"));
    this.setDispFlag((String)lUrlParam.getParam("dispFlag"));
    this.setActionNameTxt((String)lUrlParam.getParam("actionNameTxt"));
    this.setEditModeTxt((String)lUrlParam.getParam("editModeTxt"));
    this.setDispFlagTxt((String)lUrlParam.getParam("dispFlagTxt"));
  }
  
  /**
   * validate
   * 入力したデータをチェックします。
   * 不正なデータがある場合、エラーをオブジェクトに格納します。
   * そのオブジェクトは、エラーメッセージとして画面に表示されます。
   * @param HttpServletRequest ，Connection
   * @return true:エラーがない false:エラーが１つ以上ある
   * @throws なし
   */
  public boolean validate(HttpServletRequest lRequest, Connection lConnection) {
    lRequest.removeAttribute(SIConfig.SIERROR_ATTRIBUTE_MESSAGE_KEY);
    SICustomErrors errors = new SICustomErrors();
    
    if (!this.getEditModeTxt().equals(SIConfig.SIEDIT_MODE_INSERT)) {
      SICheckValid.checkValid(errors, "お知らせ番号", this.getNewsCode(), SICheckDataConf.SICHECK_DATA_EMPTY_TYPE + SICheckDataConf.SICHECK_DATA_DIGIT_TYPE);
      SICheckValid.checkValid(errors, "お知らせ番号", this.getNewsCode(), SICheckDataConf.SICHECK_DATA_BYTE_LEN_WITHIN_TYPE, 6);
    }
    
    if (!this.getEditModeTxt().equals(SIConfig.SIEDIT_MODE_DELETE)) {
      if (!SICheckUtil.isDateTime(this.getStartDateTime(), "yyyy/MM/dd HH:mm:ss")) {
        errors.addError(new SICustomError("input.data.date", "表示開始日時"));
      }
      
      SICheckValid.checkValid(errors, "表示開始日時", this.getStartDateTime(), SICheckDataConf.SICHECK_DATA_EMPTY_TYPE);
      
      SICheckValid.checkValid(errors, "表示箇所", this.getDispFlag(), SICheckDataConf.SICHECK_DATA_EMPTY_TYPE);
      
      SICheckValid.checkValid(errors, "本文", this.getDescription(), SICheckDataConf.SICHECK_DATA_EMPTY_TYPE);
      SICheckValid.checkValid(errors, "本文", this.getDescription(), SICheckDataConf.SICHECK_DATA_BYTE_LEN_WITHIN_TYPE, 1000);
    }
    
    if (!errors.isEmpty())
      lRequest.setAttribute(SIConfig.SIERROR_ATTRIBUTE_MESSAGE_KEY, errors);
    
    return errors.isEmpty();
  }
  
  /**
   * getFirstColl
   * @param
   * @return SINews
   * @throws
   */
  public SINews getFirstColl() {
    SINews lnews = new SINews();
    lnews.setEncode(SIConfig.SIENCODE_NONE);
    
    lnews.setNewsCode(this.getNewsCode());
    lnews.setDescription(this.getDescription());
    lnews.setNewsFromDateYear(this.getNewsFromDateYear());
    lnews.setNewsFromDateMonth(this.getNewsFromDateMonth());
    lnews.setNewsFromDateDay(this.getNewsFromDateDay());
    lnews.setNewsFromDateHour(this.getNewsFromDateHour());
    lnews.setStartDateTime(this.getStartDateTime());
    lnews.setDispFlag(this.getDispFlag());
    
    lnews.setActionNameTxt(this.getActionNameTxt());
    lnews.setEditModeTxt(this.getEditModeTxt());
    
    return lnews;
  }
  /**
   * getFirstColl
   * @param Connection ,String
   * @return SINews
   * @throws SIDBAccessException
   */
  public SINews getFirstColl(Connection lConnection, String pNewsCode) throws SIDBAccessException {
    if (getCollection(lConnection, pNewsCode).isEmpty() || pNewsCode.trim().length() == 0) {
      SINews news = new SINews();
      news.setDispFlag(this.getDispFlagTxt());
      return news;
    } else {
      return (SINews) getCollection(lConnection, pNewsCode).iterator().next();
    }
  }
  
  /**
   * getCollection
   * 条件に合ったレコードを検索して、結果のコネクションを作成して、戻します。
   * @param lConnection データベースへの接続コネクション
   * @return レコードのセット
   * @throws なし
   */
  public Collection getCollection(Connection lConnection, String pNewsCode) throws SIDBAccessException {
    Statement lStatement = null;
    ResultSet lResultSet = null;
    SINews lNews = new SINews();
    StringBuffer lSqlStatement = new StringBuffer();
    Collection news = new ArrayList();
    SIDateTime mydatefrom;
    
    //基本のSQL
    lSqlStatement.append(" SELECT *,CASE WHEN startdatetime < current_timestamp THEN 1 ELSE 0 END AS isstart FROM newsmtbl WHERE 1=1");
    SITableConditionManager lConditionMan = new SITableConditionManager();
    SITableCondition DD = new SITableCondition("", "newscode", pNewsCode, SIConfig.SICONDITION_TYPE_EQUAL, SIConfig.SICONDITION_TYPE_AND);
    DD.setBlankEnable(false);
    lConditionMan.add(DD);
    DD = new SITableCondition("", "dispflg", this.dispFlagTxt, SIConfig.SICONDITION_TYPE_EQUAL, SIConfig.SICONDITION_TYPE_AND);
    DD.setBlankEnable(false);
    lConditionMan.add(DD);
    
    lSqlStatement.append(lConditionMan.getCondtionSQL());
    lSqlStatement.append(" ORDER BY startdatetime DESC");
    
    log.debug("sqlStatement=" + lSqlStatement.toString());
    //実行
    try {
      lStatement = lConnection.createStatement();
      lResultSet = lStatement.executeQuery(lSqlStatement.toString());
      
      int[][] newsCount =  {
          {0,5,15}//top
          ,{0,5,15}//hair
          ,{0,5,15}//haircosme
          ,{0,5,15}//esthe
          ,{0,5,15}//bed
          ,{0,5,15}//cosme
          ,{0,5,15}//nail
          ,{0,5,15}//book
          ,{0,5,15}//eyelash
          ,{0,5,5}//mobile
          ,{0,5,15}//EG
      };
      
      //商品レコードのセットの作成
      while (lResultSet.next()) {
        lNews = new SINews();
        lNews.setEncode(SIConfig.SIENCODE_NONE);
        lNews.setNewsCode(lResultSet.getString("newscode"));
        
        lNews.setStartDateTime(SIDBUtil.getDateTime(lResultSet.getTimestamp("startdatetime")));
        
        mydatefrom = new SIDateTime(lResultSet.getTimestamp("startdatetime"));
        
        lNews.setNewsFromDateYear(String.valueOf(mydatefrom.getYear()));
        lNews.setNewsFromDateMonth(String.valueOf(mydatefrom.getMonth()));
        lNews.setNewsFromDateDay(String.valueOf(mydatefrom.getDay()));
        lNews.setNewsFromDateHour(String.valueOf(mydatefrom.getHourStr()));
        
        lNews.setDescription(lResultSet.getString("description"));
        lNews.setDelFlag(lResultSet.getString("delflag"));
        lNews.setDispFlag(lResultSet.getString("dispflg"));
        if ("0".equals(lResultSet.getString("isStart"))) {
          lNews.setDispEnable("0");
        } else if (newsCount[Integer.parseInt(lNews.getDispFlag())][0]<newsCount[Integer.parseInt(lNews.getDispFlag())][1]) {
          lNews.setDispEnable("1");
          newsCount[Integer.parseInt(lNews.getDispFlag())][0]++;
        } else if (newsCount[Integer.parseInt(lNews.getDispFlag())][0]<newsCount[Integer.parseInt(lNews.getDispFlag())][2]) {
          lNews.setDispEnable("2");
          newsCount[Integer.parseInt(lNews.getDispFlag())][0]++;
        } else {
          lNews.setDispEnable("0");
        }
        lNews.setUpdateDateTime(SIDBUtil.getDateTime(lResultSet.getTimestamp("updatedatetime")));
        
        news.add(lNews);
      }
    } catch (Exception ex) {
      throw new SIDBAccessException(ex);
    } finally {
      SIDBUtil.close(lResultSet, lStatement);
    }
    return news;
  }
  
  public String getStartDateTime() {
    if (SIUtil.isNull(getNewsFromDateYear()) && SIUtil.isNull(getNewsFromDateMonth()) && SIUtil.isNull(getNewsFromDateDay()) && SIUtil.isNull(getNewsFromDateHour())) {
      return "";
    }
    log.debug("getSaleFromDate:" + getNewsFromDateYear() + "/" + getNewsFromDateMonth() + "/" + getNewsFromDateDay() + " " + this.getNewsFromDateHour());
    return this.getNewsFromDateYear() + "/" + this.getNewsFromDateMonth() + "/" + this.getNewsFromDateDay() + " " + this.getNewsFromDateHour()+":00:00";
  }
  
  /**
   * @return
   */
  public String getDelFlag() {
    return delFlag;
  }
  
  /**
   * @return
   */
  public String getDescription() {
    return description;
  }
  
  /**
   * @return
   */
  public String getInitDateTime() {
    return initDateTime;
  }
  
  /**
   * @return
   */
  public Category getLog() {
    return log;
  }
  
  /**
   * @return
   */
  public String getNewsCode() {
    return newsCode;
  }
  
  /**
   * @param string
   */
  public void setDelFlag(String string) {
    delFlag = string;
  }
  
  /**
   * @param string
   */
  public void setDescription(String string) {
    if (SIUtil.isNull(string)) string = "";
    string = SIStringUtil.replace(string, "\r\n", "");
    this.description = SIUtil.changeTo(string.trim(), this.encode);
  }
  
  /**
   * @param string
   */
  public void setInitDateTime(String string) {
    initDateTime = string;
  }
  
  /**
   * @param category
   */
  public void setLog(Category category) {
    log = category;
  }
  
  /**
   * @param string
   */
  public void setNewsCode(String string) {
    newsCode = string;
  }
  
  /**
   * @return
   */
  public String getDispFlag() {
    return dispFlag;
  }
  
  /**
   * @return
   */
  public String getDispFlagTxt() {
    return dispFlagTxt;
  }
  
  /**
   * @param string
   */
  public void setDispFlag(String string) {
    dispFlag = string;
  }
  
  /**
   * @param string
   */
  public void setDispFlagTxt(String string) {
    dispFlagTxt = string;
  }
  
  /**
   * @return
   */
  public String getNewsFromDateDay() {
    return newsFromDateDay;
  }
  
  /**
   * @return
   */
  public String getNewsFromDateHour() {
    return newsFromDateHour;
  }
  
  /**
   * @return
   */
  public String getNewsFromDateMonth() {
    return newsFromDateMonth;
  }
  
  /**
   * @return
   */
  public String getNewsFromDateYear() {
    return newsFromDateYear;
  }
  
  /**
   * @param string
   */
  public void setNewsFromDateDay(String string) {
    newsFromDateDay = string;
  }
  
  /**
   * @param string
   */
  public void setNewsFromDateHour(String string) {
    newsFromDateHour = string;
  }
  
  /**
   * @param string
   */
  public void setNewsFromDateMonth(String string) {
    newsFromDateMonth = string;
  }
  
  /**
   * @param string
   */
  public void setNewsFromDateYear(String string) {
    newsFromDateYear = string;
  }
}
