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

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

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.SILogin;
import jp.co.sint.beans.mallmgr.UIRegReview;
import jp.co.sint.beans.mallmgr.UIReviewListCond;
import jp.co.sint.config.SIConfig;
import jp.co.sint.config.SIDBMultiConf;
import jp.co.sint.database.SIDBAccessException;
import jp.co.sint.database.SIDBUtil;//7.2.0 ST0303 追加
import jp.co.sint.database.SIDatabaseConnection;
import jp.co.sint.database.SIDateTimeType;
import jp.co.sint.database.SIDeleteRec;
import jp.co.sint.database.SIDuplicateKeyException;
import jp.co.sint.database.SIInsertRec;
import jp.co.sint.database.SIModifyRec;
import jp.co.sint.database.SITableCondition;
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.SIDebtPointException;//7.2.0 ST0303 追加
import jp.co.sint.tools.SIErrorFactory;
import jp.co.sint.tools.SIHTMLUtil;
import jp.co.sint.tools.SIURLMap;
import jp.co.sint.tools.SIUtil;

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



/**
 * @version $Id: SIRegShopSrv.java,v 1.0 2003/07/25 Exp $
 * @author  Shioinoya Yoshiaki
 * <br>Description: レビュー表示などの更新を行うServlet
 * <p>History</p>
 * <p>Author                        Date                     Reason</p>
 * ============&nbsp;&nbsp;&nbsp;==========&nbsp;&nbsp;===========================<br>
 * Shionoya Yoshiaki       2003/09/01          Original
 */

public class SIRegReviewSrv extends SIServlet {
	//ログ用のインスタンスの生成
	private static Category log =Category.getInstance(SIConfig.SILOG4J_WEBSHOP_CATEGORY_NAME);

	/**
	 * <b>doUpdate</b>
	 * HTTP リクエストの処理
	 * @param HttpServletRequest
	 * @param HttpServletResponse
	 * @return なし
	 * @throws ServletException
	 * @throws IOException
	 */
	public void doUpdate(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    SILogin manLogin=SIHTMLUtil.getLogin(request);
    if (!manLogin.isLogin()){
      forwardKey(request,response,"webshop.jsp.manager.login");
      return;
    }

		HttpSession session=request.getSession(true);//セッションの取得
		SIDatabaseConnection databaseConnection=new SIDatabaseConnection();//DBへのコネクションの作成
		SIURLParameter urlParam = new SIURLParameter(request);//7.1.1 ST0236 追加

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

      UIRegReview regReview=new UIRegReview();
      UIReviewListCond reviewList=new UIReviewListCond();
      session.removeAttribute(SIConfig.SISESSION_MAN_REVIEW_EDIT_NAME);

      if (SIConfig.SIACTION_LIST.equalsIgnoreCase(actionName)) { //一覧と検索などの画面
        //データの取得
        UIReviewListCond listCond=new UIReviewListCond();
        //データ
		reviewList = new UIReviewListCond(request,urlParam);//7.1.1 ST0236 修正
		reviewList.init(request,urlParam);//get data	//7.1.1 ST0236 修正
        reviewList.validate(request);//valid
        session.setAttribute(SIConfig.SISESSION_MAN_REVIEW_LIST_NAME,reviewList);
        forwardKey(request,response,"webshop.jsp.manager.review.list");
      } else if (SIConfig.SIACTION_CONFIRM.equalsIgnoreCase(actionName)) { //データの確認画面へ
        //データの取得
		regReview.init(request,urlParam);//7.1.1 ST0236 修正
        session.setAttribute(SIConfig.SISESSION_MAN_REVIEW_DETAIL_NAME,regReview);
        //データのチェック
        if (regReview.validate(request, databaseConnection.getConnection()) == false){
          forwardKey(request,response,"webshop.jsp.manager.review.list");
        }else{
          forwardKey(request,response,"webshop.jsp.manager.review.list");
        }
      }else if (SIConfig.SIACTION_MODIFY.equalsIgnoreCase(actionName)) { //レコードの修正
        //データの取得とデータのチェック
		regReview = new UIRegReview(request,urlParam);//7.1.1 ST0236 修正
		regReview.initModify(request,urlParam);//get data	//7.1.1 ST0236 修正
        session.setAttribute(SIConfig.SISESSION_MAN_REVIEW_EDIT_NAME,regReview);
        if (!regReview.validateModify(request)){
          forwardKey(request,response,"webshop.jsp.manager.review.list");
        }else{
          try {
            //状態の更新
            updateTableData(databaseConnection.getConnection(),regReview);
            //ポイントのインサート
            insertTableData(databaseConnection.getConnection(),regReview,manLogin);
            databaseConnection.getConnection().commit();
            session.removeAttribute(SIConfig.SISESSION_MAN_REVIEW_EDIT_NAME);
            request.setAttribute(SIConfig.SIMESSAGE_ATTRIBUTE_RESULT_NAME,
                                 SIErrorFactory.getErrorMsg("manager.message.success.insert"));
            String lUrl=SIURLMap.getUrl("webshop.servlet.manager.review")+"?actionNameTxt="+SIConfig.SIACTION_REFRESH;
            redirectHttps(request, response, lUrl);//7.1.1 ST0174 修正
          }catch(SIDuplicateKeyException sqle){
            try {databaseConnection.getConnection().rollback();}catch(SQLException e){e.printStackTrace();}
            SICustomErrors errors = new SICustomErrors();
            errors.addError(new SICustomError("database.insert.duplicate"));
            request.setAttribute(SIConfig.SIERROR_ATTRIBUTE_MESSAGE_KEY_BAK,errors);
            forwardKey(request,response,"webshop.jsp.manager.review.list");
          }catch(SIDBAccessException sqle){
            try {databaseConnection.getConnection().rollback();}catch(SQLException e){e.printStackTrace();}
            SICustomErrors errors = new SICustomErrors();
            errors.addError(new SICustomError("database.execute.error"));
            request.setAttribute(SIConfig.SIERROR_ATTRIBUTE_MESSAGE_KEY_BAK,errors);
            forwardKey(request,response,"webshop.jsp.manager.review.list");
          }catch(SQLException sqle){
            try {databaseConnection.getConnection().rollback();}catch(SQLException e){e.printStackTrace();}
            SICustomErrors errors = new SICustomErrors();
            errors.addError(new SICustomError("database.execute.error"));
            request.setAttribute(SIConfig.SIERROR_ATTRIBUTE_MESSAGE_KEY_BAK,errors);
            forwardKey(request,response,"webshop.jsp.manager.review.list");
						//7.2.0 ST0303 追加ここから
					}catch(SIDebtPointException e){
						e.printStackTrace();
						try {databaseConnection.getConnection().rollback();}catch(SQLException ee){ee.printStackTrace();}
						request.removeAttribute(SIConfig.SIERROR_ATTRIBUTE_MESSAGE_KEY_BAK);
						SICustomErrors errors=new SICustomErrors();
						errors.addError(new SICustomError("manager.message.failure.addPoint"));
						request.setAttribute(SIConfig.SIERROR_ATTRIBUTE_MESSAGE_KEY_BAK,errors);
						forwardKey(request,response,"webshop.jsp.manager.review.list");
						//7.2.0 ST0303 追加ここまで
          }
        }
      }else if (SIConfig.SIACTION_DELETE.equalsIgnoreCase(actionName)){//レコードの削除
        //キーデータの取得とデータのチェック
         regReview=new UIRegReview();
		 regReview.initModify(request,urlParam);//7.1.1 ST0236 修正
          try {
            //レコードの削除
            deleteTableData(databaseConnection.getConnection(),regReview);
            request.setAttribute(SIConfig.SIMESSAGE_ATTRIBUTE_RESULT_NAME,
                                 SIErrorFactory.getErrorMsg("manager.message.success.delete"));
            forwardKey(request,response,"webshop.jsp.manager.review.list");
          } catch (SIDBAccessException e) {
            e.printStackTrace();
            SICustomErrors errors=new SICustomErrors();
            errors.addError(new SICustomError("database.execute.error"));
            request.setAttribute(SIConfig.SIERROR_ATTRIBUTE_MESSAGE_KEY_BAK,errors);
            forwardKey(request,response,"webshop.jsp.manager.review.list");
          }
      }
      else if (SIConfig.SIACTION_REFRESH.equals(actionName)){
        request.setAttribute(SIConfig.SIMESSAGE_ATTRIBUTE_RESULT_NAME,
                                         SIErrorFactory.getErrorMsg("manager.message.success.insert"));
        forwardKey(request, response, "webshop.jsp.manager.review.list");  
      }
    }catch (SQLException e){
      e.printStackTrace();
      throw new ServletException();
    }catch (NamingException e){
      e.printStackTrace();
      throw new ServletException();
    }finally{
      databaseConnection.close();
    }

	}

	/**
	 * <b>updateTableData</b>
	 * レビューテーブルに状態の項目のデータを修正します。
	 * @param lConnection DBへのコネクション
	 * @param regReview 入力データセット
	 * @return なし
	 * @throws SIDuplicateKeyException
	 * @throws SIDBAccessException
	 */
	private void updateTableData(Connection lConnection,UIRegReview regReview)throws SIDuplicateKeyException,SIDBAccessException{
    SITableCondition lTableCondtion=new SITableCondition();
	  SIModifyRec lRec=new SIModifyRec("Reviewtbl");

	  Iterator lDispFlgIta=regReview.getDispFlgMap().keySet().iterator();
	  String lDispFlgName="";
	  String lDispFlgValue="";
	  String lReviewCode="";

      while (lDispFlgIta.hasNext()){
			//基本データの作成
			lRec=new SIModifyRec("ReviewTbl");
			lDispFlgName=(String)lDispFlgIta.next();
			lDispFlgValue=regReview.getDispFlgValue(lDispFlgName);
			lReviewCode=lDispFlgName.substring(0,lDispFlgName.length()-SIConfig.SISUFFIX_HTML_RADIO.length());

			//レコードの修正
			lRec.add("DispFlg",lDispFlgValue);
			lRec.addCondition("ReviewCode",lReviewCode);//レビューコード
			lTableCondtion=new SITableCondition("","DispFlg",lDispFlgValue,SIConfig.SICONDITION_TYPE_NOT_EQUAL);
			lRec.addCondition(lTableCondtion);

      //実行
			lRec.execute(lConnection);
      }
	}

	/**
	 * <b>deleteTableData</b>
	 * データベースにレコードを削除します。
	 * @param lConnection DBへのコネクション
	 * @param regReview 削除するデータ
	 * @return なし
	 * @throws SIDBAccessException
	 */
	private void deleteTableData(Connection lConnection,UIRegReview regReview) throws SIDBAccessException{
		SIDeleteRec lRec=new SIDeleteRec("ReviewTbl");
		lRec.addCondition("ReviewCode",regReview.getRegReviewCodeTxt());
	try {
	  lRec.execute(lConnection);
			lConnection.commit();
	} catch (SIDuplicateKeyException e) {
		} catch(SQLException sqle){
			throw new SIDBAccessException("delete data error.");
		}
	}
	/**
	 * <b>insertTableData</b>
	 * ポイント管理テーブルに新規加算点のレコードを作成します。
	 * @param lConnection DBへのコネクション
	 * @param regReview 入力データセット
	 * @param manLogin ログインデータ
	 * @return なし
	 * @throws SIDuplicateKeyException
	 * @throws SIDBAccessException
	 */
	private void insertTableData(Connection lConnection,UIRegReview regReview,SILogin manLogin)throws SIDuplicateKeyException,SIDBAccessException, SIDebtPointException{//7.2.0 ST0303 修正
		SIInsertRec lRec=new SIInsertRec("PointManTbl");
		UIRegReview lReview=new UIRegReview();
    SIDateTime lDateTime = new SIDateTime();

		Iterator lReviewPointIta=regReview.getReviewPointMap().keySet().iterator();
		String lReviewPointName="";
		String lReviewPointValue="";
		String lReviewCode="";
    String lShopCode=manLogin.getMallShopCode();

		//7.2.0 ST0303追加ここから
		StringBuffer lPointBuf=new StringBuffer();
		//7.2.0 ST0303追加ここまで

		while (lReviewPointIta.hasNext()){
			lRec=new SIInsertRec("PointManMTbl");

			//基本データの作成
			lReviewPointName=(String)lReviewPointIta.next();
			lReviewPointValue=regReview.getReviewPointValue(lReviewPointName);
			lReviewCode=lReviewPointName.substring(0,lReviewPointName.length()-SIConfig.SISUFFIX_HTML_TEXT.length());
			//データがなければ、インサートしない
			if (SIUtil.isNull(lReviewPointValue)) continue;

      //該当レビューの基本データの取得
			lReview=new UIRegReview();
			lReview.setReviewCode(lReviewCode);
			lReview.reset(lConnection);

			//7.2.0 ST0303 追加ここから
			//顧客のポイント残高+加算ポイント(マイナス入力時）がマイナスになったらエラー
			lPointBuf=new StringBuffer();
			lPointBuf.append("SELECT SUM(PointOfIssue) + (" + lReviewPointValue.trim() +")");
			lPointBuf.append(" AS AfterPoint FROM PointManMTbl ");//7.2.0 ST0324 修正
			lPointBuf.append(" WHERE CustCode = ");
			lPointBuf.append(lReview.getCustCode());
			lPointBuf.append(" AND ENABLEFLG = '1'");
			lPointBuf.append(" GROUP BY CustCode");

      //7.2.1 ST2009 修正 ここから
      long AfterPoint = 0;
      if(SIUtil.isNotNull(SIDBUtil.getFirstData(lConnection,lPointBuf.toString()))){
        AfterPoint = Long.parseLong(SIDBUtil.getFirstData(lConnection,lPointBuf.toString()));
      }else{
				AfterPoint = Long.parseLong(lReviewPointValue.trim());
      }
      /*int AfterPoint = 0;
      if(SIUtil.isNotNull(SIDBUtil.getFirstData(lConnection,lPointBuf.toString()))){
        AfterPoint = Integer.parseInt(SIDBUtil.getFirstData(lConnection,lPointBuf.toString()));
      //7.2.0 ST0305追加ここから
      }else{
				AfterPoint = Integer.parseInt(lReviewPointValue.trim());
      //7.2.0 ST0305追加ここまで
      }*/
      //7.2.1 ST2009 修正 ここまで
		
			if (AfterPoint < 0 ){
				throw new SIDebtPointException("ポイント残高がマイナスになる顧客がいます。");
			}
			//7.2.0 ST0303 追加ここまで

      //レコードの作成
			lRec.add("CustCode", lReview.getCustCode());
			lRec.add("MallShopCode", lShopCode);
			lRec.add("IssueFlg",1);
			lRec.add("PointOfIssue",lReviewPointValue.trim());
			lRec.add("ReviewCode",lReviewCode);
      if (SIDBMultiConf.SIDB_CURRENT_INX ==SIDBMultiConf.SIDB_POSTGRESQL_INX){
        lRec.add("ISSUEDATETIME",lDateTime.getFullDateTime());
      }else{
        lRec.add("ISSUEDATETIME",new SIDateTimeType(lDateTime.getFullDateTime()));
      }

			//実行
			lRec.execute(lConnection);
		}
	}

  public void destroy() {
  }
}
