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

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

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.UIRegPointRule;
import jp.co.sint.config.SIConfig;
import jp.co.sint.database.SIDBAccessException;
import jp.co.sint.database.SIDatabaseConnection;
import jp.co.sint.database.SIDuplicateKeyException;
import jp.co.sint.database.SIModifyRec;
import jp.co.sint.servlet.SIServlet;
import jp.co.sint.tools.SICustomError;
import jp.co.sint.tools.SICustomErrors;
import jp.co.sint.tools.SIErrorFactory;
import jp.co.sint.tools.SIHTMLUtil;

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

/**
 * @version $Id: SIRegPointRuleSrv.java,v 1.0 2003/09/16  Exp $
 * @author  Arai Makoto
 * <br>Description:
 * <p>History</p>
 * <p>Author&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Date&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Reason</p>
 *  ============&nbsp;&nbsp;&nbsp;==========&nbsp;&nbsp;===========================<br>
 * arai   2003/09/16
 */
public class SIRegPointRuleSrv 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 {
    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 {
      Connection connection;
      
      String actionName=this.getActionName(urlParam);//画面からのアクション//7.1.1 ST0236 修正
      String editMode = this.getEditMode(urlParam); //DBへの編集モード//7.1.1 ST0236 修正
      
      UIRegPointRule regEdit = new UIRegPointRule();
      
      //データベースへのコネクションの作成
      connection = databaseConnection.getConnection();
      
      if (SIConfig.SIACTION_MODIFY.equalsIgnoreCase(actionName)) {
        //データの取得とデータのチェック
        regEdit.init(request,urlParam);//7.1.1 ST0236 修正
        forwardKey(request, response, "webshop.jsp.manager.point.edit");
      } else if (SIConfig.SIACTION_REMODIFY.equalsIgnoreCase(actionName)) {
        //データの取得とデータのチェック
        regEdit = (UIRegPointRule) session.getAttribute(SIConfig.SISESSION_MAN_POINT_RULE_EDIT_NAME);
        session.setAttribute(SIConfig.SISESSION_MAN_POINT_RULE_EDIT_NAME, regEdit);
        forwardKey(request, response, "webshop.jsp.manager.point.edit");
      } else if (SIConfig.SIACTION_CONFIRM.equalsIgnoreCase(actionName)) {
        //データの取得とデータのチェック
        regEdit.init(request,urlParam);//7.1.1 ST0236 修正
        session.setAttribute(SIConfig.SISESSION_MAN_POINT_RULE_EDIT_NAME, regEdit);
        regEdit = (UIRegPointRule) session.getAttribute(SIConfig.SISESSION_MAN_POINT_RULE_EDIT_NAME);
        //データのチェック
        if (regEdit.validate(request, connection) == false) {
          forwardKey(request, response, "webshop.jsp.manager.point.edit");
        } else {
          forwardKey(request, response, "webshop.jsp.manager.point.confirm");
        }
      } else {
        //データの取得
        regEdit = (UIRegPointRule) session.getAttribute(SIConfig.SISESSION_MAN_POINT_RULE_EDIT_NAME);
        regEdit.setActionNameTxt(actionName);
        regEdit.setEditModeTxt(editMode);
        session.setAttribute(SIConfig.SISESSION_MAN_POINT_RULE_EDIT_NAME, regEdit);
        //データのチェック
        if (regEdit.validate(request, connection) == false) {
          forwardKey(request, response, "webshop.jsp.manager.point.confirm");
        } else {
          try {
            if (editMode.equalsIgnoreCase(SIConfig.SIEDIT_MODE_UPDATE)) {
              updateTableData(connection, regEdit);
              request.setAttribute(SIConfig.SIMESSAGE_ATTRIBUTE_RESULT_NAME,SIErrorFactory.getErrorMsg("manager.message.success.modify"));
            } else log.error("no known edit mode.editMode=" + editMode);
            forwardKey(request, response, "webshop.jsp.manager.point.result");
          } catch (SIDuplicateKeyException sqle) {
            SICustomErrors errors = new SICustomErrors();
            errors.addError(new SICustomError("database.insert.duplicate"));
            request.setAttribute(SIConfig.SIERROR_ATTRIBUTE_MESSAGE_KEY, errors);
            forwardKey(request, response, "webshop.jsp.manager.point.edit");
          } catch (SIDBAccessException sqle) {
            SICustomErrors errors = new SICustomErrors();
            errors.addError(new SICustomError("database.execute.error"));
            request.setAttribute(SIConfig.SIERROR_ATTRIBUTE_MESSAGE_KEY, errors);
            forwardKey(request, response, "webshop.jsp.manager.point.edit");
          }
        }
      }
    }catch (SQLException e){
      e.printStackTrace();
      throw new ServletException();
    }catch (NamingException e){
      e.printStackTrace();
      throw new ServletException();
    }finally{
      databaseConnection.close();
    }
  }

  /**
   * updateTableData
   * データベースにレコードを修正します。
   * @param Connection
   * @param UIRegPointRule
   * @throws SIDuplicateKeyException
   * @throws SIDBAccessException
   */
  private void updateTableData(Connection connection, UIRegPointRule regEdit) throws SIDuplicateKeyException, SIDBAccessException {
    SIModifyRec lRec = new SIModifyRec("pointShopMTbl");
    
    lRec.addCondition("mallshopcode", regEdit.getMallShopCode());
    lRec.add("mincost", regEdit.getMinCost());
    lRec.add("pointrate", regEdit.getPointRate());
    lRec.add("initpoint", regEdit.getInitPoint());
    lRec.add("setdateofbonus", regEdit.getSetDateOfBonus());
    lRec.add("bonusfromdate", regEdit.getBonusFromDate());
    lRec.add("bonustodate", regEdit.getBonusToDate());
    lRec.add("bonuspointrate", regEdit.getBonusPointRate());
    lRec.add("stndrdofissue", regEdit.getStndrdOfIssue());
    lRec.add("period", regEdit.getPeriod());
    lRec.add("specialRate", regEdit.getSpecialRate());
    
    log.debug("update sql=" + lRec.getSQL());
    
    lRec.execute(connection);
    try {
      connection.commit();
    } catch (SQLException sqle) {
      throw new SIDBAccessException("update data error.");
    }
  }
  
  public void destroy() {
  }
}