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

import java.sql.*;
import java.util.*;
import javax.servlet.http.*;

import org.apache.log4j.Category;
import jp.co.sint.database.*;
import jp.co.sint.tools.*;
import jp.co.sint.config.*;
import jp.co.sint.basic.*;
import jp.co.sint.tools.SIURLParameter;//7.1.1 ST0236 追加

/**
 * @version $Id : UIRegReview.java,v 1.0 2003/09/01 Exp $
 * @author      : Shionoya Yoshiaki
 * <br>Description : レビュー管理の明細画面に対する管理beans
 * <p>History</p>
 * <p>Author                        Date                      Reason</p>
 * ============&nbsp;&nbsp;&nbsp;==========&nbsp;&nbsp;===========================<br>
 * Shionoya Yoshiaki       2003/09/01          Original
 */

public class UIRegReview extends SIReview{
  //ログ用のインスタンスの生成
  private static Category log=Category.getInstance(SIConfig.SILOG4J_WEBSHOP_CATEGORY_NAME);
  
  //削除用のレビューコード
  private String regReviewCodeTxt="";
  
  /**
   * UIRegReview
   * コンストラクタ
   * @param lRequest
   * @return なし
   * @throws なし
   */
  public UIRegReview() {}
  
  //7.1.1 ST0236 修正 ここから
  public UIRegReview(HttpServletRequest lRequest,SIURLParameter lUrlParam){
    init(lRequest,lUrlParam);
  }
  //7.1.1 ST0236 修正 ここまで
  
  //setter of 削除用のレビューコード
  public void setRegReviewCodeTxt(String lRegReviewCodeTxt){
    if (SIUtil.isNull(lRegReviewCodeTxt)) lRegReviewCodeTxt="";
    this.regReviewCodeTxt = SIUtil.changeTo(lRegReviewCodeTxt.trim(),this.encode);
  }
  
  //getter of 削除用のレビューコード
  public String getRegReviewCodeTxt(){
    return this.regReviewCodeTxt;
  }
  
  //状態
  private HashMap dispFlgMap=new HashMap();
  
  //レビューポイントのセット
  private HashMap reviewPointMap=new HashMap();
  
  public void addDispFlg(String lName,String lValue){
    dispFlgMap.put(lName,lValue);
  }
  
  public void addReviewPoint(String lName,String lValue){
    reviewPointMap.put(lName,SIUtil.changeTo(lValue.trim(),this.encode));
  }
  
  public String getDispFlgValue(String lName){
    if (dispFlgMap==null)return "";
    String lVal=(String)dispFlgMap.get(lName);
    if (lVal==null) return "";
    else return lVal.trim();
  }
  
  public HashMap getDispFlgMap(){
    return dispFlgMap;
  }
  
  public String getReviewPointValue(String lName){
    if (reviewPointMap==null)return "";
    String lVal=(String)reviewPointMap.get(lName);
    if (lVal==null) return "";
    else return lVal.trim();
  }
  
  public HashMap getReviewPointMap(){
    return reviewPointMap;
  }
  
  /**
   * <b>init</b>
   * 入力したデータを基づいて、このbeansを設定します。
   * @param request
   * @param lUrlParam
   * @return true:不正なデータがある false:ない
   * @throws なし
   */
  //7.1.1 ST0236 修正 ここから
  public void init(HttpServletRequest lRequest,SIURLParameter lUrlParam){
    SILogin lLogin=SIHTMLUtil.getLogin(lRequest);
    
    this.setEncode(SIConfig.SIENCODE_SHIFT_JIS);
    this.setReviewCode((String)lUrlParam.getParam("reviewCode"));
    if (lLogin.isShop()){
      this.setShopCode(lLogin.getMallShopCode());
    }else{
      this.setShopCode((String)lUrlParam.getParam("shopCode"));
    }
    this.setNickName((String)lUrlParam.getParam("nickName"));
    this.setEmail((String)lUrlParam.getParam("email"));
    this.setCmdtyCode((String)lUrlParam.getParam("cmdtyCode"));
    this.setCmdtyName((String)lUrlParam.getParam("CmdtyName"));
    this.setTitle((String)lUrlParam.getParam("title"));
    this.setContent((String)lUrlParam.getParam("content"));
    this.setSex((String)lUrlParam.getParam("sex"));
    this.setMemberFlg((String)lUrlParam.getParam("memberFlg"));
    this.setBuyFlg((String)lUrlParam.getParam("buyFlg"));
    this.setFirstFlg((String)lUrlParam.getParam("firstFlg"));
    this.setDispFlg((String)lUrlParam.getParam("dispFlg"));
  }
  //7.1.1 ST0236 修正 ここまで
  
  /**
   * <b>initModify</b>
   * 入力したデータを基づいて、このbeansを設定します。
   * @param request
   * @param lUrlParam
   * @return true:不正なデータがある false:ない
   * @throws なし
   */
  public void initModify(HttpServletRequest lRequest,SIURLParameter lUrlParam){//7.1.1 ST0236 修正
    Enumeration lEnumeration = lRequest.getParameterNames();
    String lName="";
    this.setEncode(SIConfig.SIENCODE_SHIFT_JIS);
    this.setRegReviewCodeTxt((String)lUrlParam.getParam("regReviewCodeTxt"));//編集ショップコード  //7.1.1 ST0236 修正
    
    while (lEnumeration.hasMoreElements()){
      lName=(String)lEnumeration.nextElement();
      if (lName.endsWith(SIConfig.SISUFFIX_HTML_RADIO)){
        this.addDispFlg(lName,(String)lUrlParam.getParam(lName));//7.1.1 ST0236 修正
      }else if (lName.endsWith(SIConfig.SISUFFIX_HTML_TEXT)){
        this.addReviewPoint(lName,(String)lUrlParam.getParam(lName));//7.1.1 ST0236 修正
      }
    }
  }
  
  /**
   * validate
   * 入力したデータをチェックします。不正なデータがあったら、エラーオブジェクトに入れて、
   * 画面に表示します。
   * @param request データベースへのコネンクション
   * @return true:不正なデータがある false:ない
   * @throws なし
   */
  public boolean validate(HttpServletRequest lRequest){
    return validate(lRequest,null);
  }
  
  /**
   * <b>validate</b>
   * 入力したデータをチェックします。不正なデータがあったら、エラーオブジェクトに入れて、
   * 画面に表示します。
   * @param lRequest クライアントからリクエスト
   * @param lConnection データベースへのコネクション
   * @return true:不正なデータがある false:ない
   * @throws なし
   */
  public boolean validate(HttpServletRequest lRequest,Connection lConnection){
    lRequest.removeAttribute(SIConfig.SIERROR_ATTRIBUTE_MESSAGE_KEY);
    SICustomErrors errors=new SICustomErrors();
    
    SICheckValid.checkValid(errors,"ショップコード",this.getShopCode(),SICheckDataConf.SICHECK_DATA_EMPTY_TYPE+SICheckDataConf.SICHECK_DATA_ALPHA_DIGIT_TYPE);
    SICheckValid.checkValid(errors,"投稿者",this.getNickName(),SICheckDataConf.SICHECK_DATA_EMPTY_TYPE+SICheckDataConf.SICHECK_DATA_ZENKAKU_TYPE);
    SICheckValid.checkValid(errors,"メールアドレス",this.getEmail(),SICheckDataConf.SICHECK_DATA_EMPTY_TYPE+SICheckDataConf.SICHECK_DATA_MAIL_TYPE);
    SICheckValid.checkValid(errors,"商品コード",this.getCmdtyCode(),SICheckDataConf.SICHECK_DATA_EMPTY_TYPE+SICheckDataConf.SICHECK_DATA_ALPHA_DIGIT_TYPE);
    SICheckValid.checkValid(errors,"商品名",this.getCmdtyName(),SICheckDataConf.SICHECK_DATA_ZENKAKU_TYPE);
    SICheckValid.checkValid(errors,"タイトル",this.getTitle(),SICheckDataConf.SICHECK_DATA_EMPTY_TYPE+SICheckDataConf.SICHECK_DATA_ZENKAKU_TYPE);
    SICheckValid.checkValid(errors,"内容",this.getContent(),SICheckDataConf.SICHECK_DATA_ZENKAKU_TYPE);
    
    if (!errors.isEmpty()) lRequest.setAttribute(SIConfig.SIERROR_ATTRIBUTE_MESSAGE_KEY,errors);
    return errors.isEmpty();
  }
  
  /**
   * validateModify
   * 入力したデータをチェックします。不正なデータがあったら、エラーオブジェクトに入れて、
   * 画面に表示します。
   * @param request データベースへのコネンクション
   * @return true:不正なデータがある false:ない
   * @throws なし
   */
  public boolean validateModify(HttpServletRequest lRequest){
    lRequest.removeAttribute(SIConfig.SIERROR_ATTRIBUTE_MESSAGE_KEY_BAK);
    SICustomErrors errors=new SICustomErrors();
    
    Iterator lReviewPointIta=reviewPointMap.values().iterator();
    String lReviewPointVal="";
    
    while (lReviewPointIta.hasNext()){
      lReviewPointVal=(String)lReviewPointIta.next();
      SICheckValid.checkValid(errors,"加算ポイント",lReviewPointVal,SICheckDataConf.SICHECK_DATA_DIGIT_NEGATIVE_TYPE);
      if (!errors.isEmpty()) break;
    }
    if (!errors.isEmpty()) lRequest.setAttribute(SIConfig.SIERROR_ATTRIBUTE_MESSAGE_KEY_BAK,errors);
    return errors.isEmpty();
  }
  
  /**
   * reset
   * 修正モードの場合には、PKのデータを元に、明細データをデータベースから取り込んで
   * 画面に表示します。
   * @param lConnection データベースへのコネンクション
   * @return なし
   * @throws なし
   */
  public void reset(Connection lConnection){
    if (SIUtil.isNull(this.getReviewCode())) return;
    Statement lStatement=null;
    ResultSet lResultSet=null;
    String lSqlStatement="SELECT * FROM reviewtbl WHERE ReviewCode="+SIDBUtil.SQL2Str(getReviewCode());
    
    log.debug("reset:lSqlStatement="+lSqlStatement);
    try {
      lStatement=lConnection.createStatement();
      lResultSet=lStatement.executeQuery(lSqlStatement);
      
      if (lResultSet.next()){
        this.setEncode(SIConfig.SIENCODE_NONE);
        this.setReviewCode(lResultSet.getString("reviewCode"));
        this.setShopCode(lResultSet.getString("shopCode"));
        this.setCmdtyCode(lResultSet.getString("cmdtyCode"));
        this.setCmdtyName(lResultSet.getString("cmdtyName"));
        this.setTitle(lResultSet.getString("title"));
        this.setNickName(lResultSet.getString("nickName"));
        this.setEmail(lResultSet.getString("email"));
        this.setContent(lResultSet.getString("content"));
        this.setSex(lResultSet.getString("sex"));
        this.setAmountofStars(lResultSet.getString("amountofStars"));
        this.setInitDateTime(SIDBUtil.getDateTime(lResultSet.getTimestamp("initDateTime")));
        this.setBuyFlg(lResultSet.getString("buyFlg"));
        this.setMemberFlg(lResultSet.getString("memberFlg"));
        this.setCustCode(lResultSet.getString("custCode"));
        this.setFirstFlg(lResultSet.getString("firstFlg"));
        this.setDispFlg(lResultSet.getString("dispFlg"));
        this.setListDispFlg(lResultSet.getString("dispFlg"));
        this.setEncode(SIConfig.SIENCODE_SHIFT_JIS);
      }else log.error("not find record for reviewID="+getReviewCode());
    }catch(SQLException sqle){
      sqle.printStackTrace();
    }finally{
      SIDBUtil.close(lStatement,lResultSet);
    }
  }
}