/**
 * Created on 2003/11/10
 *
 * To change the template for this generated file go to
 * Window>Preferences>Java>Code Generation>Code and Comments
 */
package jp.co.sint.servlet.front;

import java.io.IOException;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.HashMap;

import javax.naming.NamingException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import jp.co.sint.basic.SICmdty;
import jp.co.sint.beans.front.UIReviewEdit;
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.database.SIDatabaseConnection;
import jp.co.sint.database.SIDateTimeType;
import jp.co.sint.database.SIDuplicateKeyException;
import jp.co.sint.database.SIInsertRec;
import jp.co.sint.servlet.SIServlet;
import jp.co.sint.tools.SICustomError;
import jp.co.sint.tools.SICustomErrors;
import jp.co.sint.tools.SIDateTime;
import jp.co.sint.tools.SIErrorFactory;
import jp.co.sint.tools.SIUtil;
import jp.co.sint.tools.SIHTMLUtil;//7.2.0 ST0328 追加
import jp.co.sint.tools.SIURLParameter;//7.1.1 ST0236 追加

import org.apache.log4j.Category;


/**
 * @author shionoya
 *
 * To change the template for this generated type comment go to
 * Window>Preferences>Java>Code Generation>Code and Comments
 */
public class SIRegReviewEditSrv extends SIServlet {
  //ログ用のインスタンスの生成
  private static Category log = Category.getInstance(SIConfig.SILOG4J_WEBSHOP_CATEGORY_NAME);
  /**
   * <b>doUpdate</b>
   * HTTP リクエストの処理
   * @param  request　リクエスト
   * @param  response
   * @return なし
   * @throws ServletException
   * @throws IOException
   */
  public void doUpdate(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		HttpSession session=request.getSession(true);//セッションの取得
		SIDatabaseConnection databaseConnection=new SIDatabaseConnection();//DBへのコネクションの作成
		SIURLParameter urlParam = new SIURLParameter(request);//7.1.1 ST0236 追加
    try {
      Connection connection;

		  String actionName=this.getActionName(urlParam);//画面からのアクション	//7.1.1 ST0236 修正
		  String editMode=this.getEditMode(urlParam);//DBへの編集モード	//7.1.1 ST0236 修正

      UIReviewEdit regReviewEdit=new UIReviewEdit();

      if (SIUtil.isNull(actionName)||SIConfig.SIACTION_MODIFY.equalsIgnoreCase(actionName)){//レコードの修正へ
				regReviewEdit.init(request,urlParam);//7.1.1 ST0236 修正
        session.setAttribute(SIConfig.SISESSION_REVIEW_EDIT_NAME,regReviewEdit);
        forwardKey(request,response,"webshop.jsp.front.review.edit");
      }else if (SIConfig.SIACTION_NEW.equalsIgnoreCase(actionName)){//新規のレコード
        session.setAttribute(SIConfig.SISESSION_REVIEW_EDIT_NAME,regReviewEdit);
        forwardKey(request,response,"webshop.jsp.front.review.edit");
      }else if (SIConfig.SIACTION_REMODIFY.equalsIgnoreCase(actionName)){//再修正へ
        forwardKey(request,response,"webshop.jsp.front.review.edit");
      }else if (SIConfig.SIACTION_CONFIRM.equalsIgnoreCase(actionName)){//データの確認画面へ
        //インスタンスの作成
        regReviewEdit=new UIReviewEdit();
        //データの取得
				regReviewEdit.init(request,urlParam);//7.1.1 ST0236 修正
        session.setAttribute(SIConfig.SISESSION_REVIEW_EDIT_NAME,regReviewEdit);
        //データのチェック
        if (regReviewEdit.validate(request,databaseConnection.getConnection())==false ){
          forwardKey(request,response,"webshop.jsp.front.review.edit");
        }else {
          forwardKey(request,response,"webshop.jsp.front.review.confirm");
        }
      }else{//DBへのデータ登録
        regReviewEdit=new UIReviewEdit();
        regReviewEdit=(UIReviewEdit)session.getAttribute(SIConfig.SISESSION_REVIEW_EDIT_NAME);
        regReviewEdit.setCustCodeTxt(SIHTMLUtil.getUserInfo(request).getCustCode());//7.2.0 ST0328 追加
        try {
          if (editMode.equalsIgnoreCase(SIConfig.SIEDIT_MODE_INSERT)){
            insertTableData(databaseConnection.getConnection(),regReviewEdit);//新規レコードの作成
            request.setAttribute(SIConfig.SIMESSAGE_ATTRIBUTE_RESULT_NAME,
                                 SIErrorFactory.getErrorMsg("manager.message.success.insert"));
            try {databaseConnection.getConnection().commit();}catch(SQLException sqle){}
          }else log.error("Found a not defined edit mode.editMode="+editMode);
          //結果画面への遷移
          //databaseConnection.close();
          forwardKey(request,response,"webshop.jsp.front.review.result");
        }catch(SIDuplicateKeyException sqle){
          try {databaseConnection.getConnection().rollback();}catch(SQLException ee){}
          SICustomErrors errors=new SICustomErrors();
          errors.addError(new SICustomError("database.insert.duplicate"));
          request.setAttribute(SIConfig.SIERROR_ATTRIBUTE_MESSAGE_KEY,errors);
          forwardKey(request,response,"webshop.jsp.front.review.edit");
        }catch(SIDBAccessException sqle){
          try {databaseConnection.getConnection().rollback();}catch(SQLException ee){}
          SICustomErrors errors=new SICustomErrors();
          errors.addError(new SICustomError("database.execute.error"));
          request.setAttribute(SIConfig.SIERROR_ATTRIBUTE_MESSAGE_KEY,errors);
          forwardKey(request,response,"webshop.jsp.front.review.edit");
        }
      }
    }catch (SQLException e){
      e.printStackTrace();
      throw new ServletException();
    }catch (NamingException e){
      e.printStackTrace();
      throw new ServletException();
    }finally{
      databaseConnection.close();
    }
  }

  /**
   * <b>insertTableData</b>
   * データベースにレコードを作成します。
   * @param lConnection DBへのコネクション
   * @param regCmdty 入力したデータ
   * @return なし
   * @throws SIDuplicateKeyException
   * @throws SIDBAccessException
   */
  public void insertTableData(Connection lConnection,UIReviewEdit reviewEdit) throws SIDuplicateKeyException,SIDBAccessException{
	SIDateTime lDateTime = new SIDateTime();
  
	SIInsertRec lRec=new SIInsertRec("ReviewTbl");

	SICmdty lCmdty=new SICmdty(reviewEdit.getShopCodeTxt(),reviewEdit.getCmdtyCodeTxt());
	lCmdty.reset(lConnection);
	reviewEdit.setEncode(SIConfig.SIENCODE_NONE);
	reviewEdit.setCmdtyNameTxt(lCmdty.getCmdtyName());

	//ファーストフラグの選択処理
	StringBuffer  lsqlFirstFlgRC=new StringBuffer();
										 lsqlFirstFlgRC.append("SELECT DISTINCT ReviewCode FROM ReviewTbl ");
										 lsqlFirstFlgRC.append("WHERE ShopCode = ");
										 lsqlFirstFlgRC.append(SIDBUtil.SQL2Str(reviewEdit.getShopCodeTxt()));
										 lsqlFirstFlgRC.append("AND CmdtyCode = ");
										 lsqlFirstFlgRC.append(SIDBUtil.SQL2Str(reviewEdit.getCmdtyCodeTxt()));
										 lsqlFirstFlgRC.append("AND Email=");
										 lsqlFirstFlgRC.append(SIDBUtil.SQL2Str(reviewEdit.getEmailTxt()));
	if (SIDBUtil.hasData(lConnection, lsqlFirstFlgRC.toString())){
		reviewEdit.setFirstFlgTxt("0");
	}else{
		reviewEdit.setFirstFlgTxt("1");
	}

	//会員フラグと顧客コードの処理
    if(SIUtil.isNull(reviewEdit.getCustCodeTxt())){//ログインしていない時
	  StringBuffer  lsqlCustCode=new StringBuffer("SELECT CustCode FROM CustTbl ");
											 lsqlCustCode.append("WHERE Email = ");
											 lsqlCustCode.append(SIDBUtil.SQL2Str(reviewEdit.getEmailTxt()));
	  HashMap lMapCustCode=SIDBUtil.getOneRowData(lConnection,lsqlCustCode.toString());
      reviewEdit.setCustCodeTxt((String)lMapCustCode.get("custcode"));//ログインしていない人の顧客コード
	  if(SIUtil.isNull(reviewEdit.getCustCodeTxt())){
	  	reviewEdit.setMemberFlgTxt("0");//ログインしていなく、かつemailが会員と一致しない時の会員フラグ
	  }else{
	  	reviewEdit.setMemberFlgTxt("1");//ログインしていなく、かつemailが会員と一致した時の会員フラグ
	  }
    }else{//ログインしている時
	reviewEdit.setMemberFlgTxt("1");//ログインしている人の会員フラグ
    }

	//購入フラグの選択処理
//7.2.0 ST1030 修正 ここから
    StringBuffer  lsqlBuyFlgCC = new StringBuffer("SELECT DISTINCT O.CustCode FROM ");
    lsqlBuyFlgCC.append(SIConfig.SIVIEW_ORDER_LATEST_NAME).append(SIDBMultiConf.SIALIAS_CURR_NAME).append("O, ");
    lsqlBuyFlgCC.append(SIConfig.SIVIEW_ORDER_DETAIL_LATEST_NAME).append(SIDBMultiConf.SIALIAS_CURR_NAME).append("ODT, ");
    lsqlBuyFlgCC.append(SIConfig.SIVIEW_ORDER_DELIVERY_LATEST_NAME).append(SIDBMultiConf.SIALIAS_CURR_NAME).append("ODL ");
//    StringBuffer  lsqlBuyFlgCC=new StringBuffer("SELECT DISTINCT CustCode FROM OrderTbl O,OrderDetailTbl ODT, OrderDeliveryTbl ODL ");
										 lsqlBuyFlgCC.append("WHERE O.OrderCode = ODT.OrderCode ");
	                                     lsqlBuyFlgCC.append("AND O.OrderCode = ODL.OrderCode ");
	                                     lsqlBuyFlgCC.append("AND ODL.shippmentdate is not null ");
										 lsqlBuyFlgCC.append("AND O.Email = ");
										 lsqlBuyFlgCC.append(SIDBUtil.SQL2Str(reviewEdit.getEmailTxt()));
										 lsqlBuyFlgCC.append("AND ODT.CmdtyCode = ");
										 lsqlBuyFlgCC.append(SIDBUtil.SQL2Str(reviewEdit.getCmdtyCodeTxt()));
//7.2.0 ST1030 修正 ここまで
	
	if (SIDBUtil.hasData(lConnection, lsqlBuyFlgCC.toString())){
	  reviewEdit.setBuyFlgTxt("1");
	} else {
	  reviewEdit.setBuyFlgTxt("0");
	}

	lRec.add("ShopCode",reviewEdit.getShopCodeTxt());//ショップコード
	lRec.add("CmdtyCode",reviewEdit.getCmdtyCodeTxt());//商品コード
	lRec.add("NickName",reviewEdit.getNickNameTxt());//投稿者
	lRec.add("Email",reviewEdit.getEmailTxt());//Email
	lRec.add("Sex",reviewEdit.getSexRdo());//性別
	lRec.add("AmountofStars",reviewEdit.getAmountofStarsLst());//おすすめ★
	lRec.add("Title",reviewEdit.getTitleTxt());//タイトル
	lRec.add("Content",reviewEdit.getContentTxt());//内容
	lRec.add("DispFlg","0");//表示フラグ
	lRec.add("CmdtyName",reviewEdit.getCmdtyNameTxt());//商品名
	lRec.add("CustCode",reviewEdit.getCustCodeTxt());//顧客コード
	lRec.add("BuyFlg",reviewEdit.getBuyFlgTxt());//購入フラグ
	lRec.add("FirstFlg",reviewEdit.getFirstFlgTxt());//ファーストフラグ
	lRec.add("MemberFlg",reviewEdit.getMemberFlgTxt());//会員フラグ
  if (SIDBMultiConf.SIDB_CURRENT_INX ==SIDBMultiConf.SIDB_POSTGRESQL_INX){
    lRec.add("INITDATETIME",lDateTime.getFullDateTime());//投稿日
  }else{
    lRec.add("INITDATETIME",new SIDateTimeType(lDateTime.getFullDateTime()));//投稿日
  }
	//レビューテーブルの更新
	lRec.execute(lConnection);

	//ショップメッセージの取得ショップメッセージをセットする
    StringBuffer  lSql=new StringBuffer();
	lSql.append("SELECT * FROM msgtemplatemtbl ");
	lSql.append("WHERE MallShopCode = ");
	lSql.append(SIDBUtil.SQL2Str(reviewEdit.getShopCodeTxt()));
	lSql.append("AND msgType = 2");

	HashMap lMap=SIDBUtil.getOneRowData(lConnection,lSql.toString());

	reviewEdit.setMsgTitleTxt((String)lMap.get("title"));
	reviewEdit.setMsgContent1Txt((String)lMap.get("content1"));
	reviewEdit.setMsgContent2Txt((String)lMap.get("content2"));
	reviewEdit.setMsgContent3Txt((String)lMap.get("content3"));

  }

public void destroy() {
  }
}
