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

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

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

import jp.co.sint.basic.SIDeliveryRule;
import jp.co.sint.basic.SILogin;
import jp.co.sint.beans.mallmgr.UIRegDeliveryRule;
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.database.SISpcType;
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 追加

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

  //ログ用のインスタンスの生成
  private static Category log = Category.getInstance(SIConfig.SILOG4J_WEBSHOP_CATEGORY_NAME);

  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 追加
    Connection connection;
    
    String actionName=this.getActionName(urlParam);//画面からのアクション //7.1.1 ST0236 修正
    String editMode = this.getEditMode(urlParam); //DBへの編集モード //7.1.1 ST0236 修正
    
    UIRegDeliveryRule regEdit = new UIRegDeliveryRule();
    
    //データベースへのコネクションの作成
    try{
      connection = databaseConnection.getConnection();
    }catch (Exception e){
      connection = null;
      return;
    }
    
    if(SIConfig.SIACTION_MODIFY.equalsIgnoreCase(actionName)){//一覧と検索などの画面
      //データの取得とデータのチェック
      regEdit.init(request,urlParam);//7.1.1 ST0236 修正
      forwardKey(request, response, "webshop.jsp.manager.delivery.edit");
    }else if(SIConfig.SIACTION_REMODIFY.equalsIgnoreCase(actionName)){//一覧と検索などの画面
      //データの取得とデータのチェック
      regEdit = (UIRegDeliveryRule) session.getAttribute(SIConfig.SISESSION_MAN_DELIVERY_RULE_EDIT_NAME);
      regEdit.setActionNameTxt(actionName);
      session.setAttribute(SIConfig.SISESSION_MAN_DELIVERY_RULE_EDIT_NAME, regEdit);
      forwardKey(request, response, "webshop.jsp.manager.delivery.edit");
    }else if(SIConfig.SIACTION_CONFIRM.equalsIgnoreCase(actionName)){//一覧と検索などの画面
      //データの取得とデータのチェック
      regEdit.init(request,urlParam);//7.1.1 ST0236 修正
      session.setAttribute(SIConfig.SISESSION_MAN_DELIVERY_RULE_EDIT_NAME, regEdit);
      regEdit = (UIRegDeliveryRule) session.getAttribute(SIConfig.SISESSION_MAN_DELIVERY_RULE_EDIT_NAME);
      
      //データのチェック
      if(regEdit.validate(request, connection) == false){
        regEdit.setActionNameTxt(SIConfig.SIACTION_REMODIFY);
        session.setAttribute(SIConfig.SISESSION_MAN_DELIVERY_RULE_EDIT_NAME, regEdit);
        forwardKey(request, response, "webshop.jsp.manager.delivery.edit");
      }else{
        forwardKey(request, response, "webshop.jsp.manager.delivery.confirm");
      }
    }else{
      //DBへのデータ登録
      //データの取得
      regEdit = (UIRegDeliveryRule) session.getAttribute(SIConfig.SISESSION_MAN_DELIVERY_RULE_EDIT_NAME);
      regEdit.setActionNameTxt(actionName);
      regEdit.setEditModeTxt(editMode);
      session.setAttribute(SIConfig.SISESSION_MAN_DELIVERY_RULE_EDIT_NAME, regEdit);
      //データのチェック
      if(regEdit.validate(request, connection) == false){
        forwardKey(request, response, "webshop.jsp.manager.delivery.edit");
      }else{
        try{
          if(editMode.equalsIgnoreCase(SIConfig.SIEDIT_MODE_UPDATE)){
            updateTableData(connection, regEdit);
            request.setAttribute(SIConfig.SIMESSAGE_ATTRIBUTE_RESULT_NAME,SIErrorFactory.getErrorMsg("manager.message.success.insert"));
          }else{
            log.error("no known edit mode.editMode=" + editMode);
          }
          forwardKey(request, response, "webshop.jsp.manager.delivery.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.delivery.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.delivery.edit");
        }
      }
    }
    //DBへのコネンクション
    databaseConnection.close();
  }
  
  /**
   * updateTableData
   * データベースにレコードを修正します。
   * @param
   * @return
   * @throws
   */
  private void updateTableData(Connection connection, UIRegDeliveryRule regEdit) throws SIDuplicateKeyException, SIDBAccessException {
    //SISpcType lSpcType = new SISpcType();
    SIModifyRec lRec = new SIModifyRec("deliveryFeeMTbl");
    
    Collection regUpd = regEdit.reset2(connection);
    
    SIDeliveryRule test = new SIDeliveryRule();
    Iterator testIta = regUpd.iterator();
    
    while (testIta.hasNext()) {
      test = (SIDeliveryRule) testIta.next();
      lRec = new SIModifyRec("deliveryFeeMTbl");
      
      lRec.addCondition("mallshopcode", test.getMallShopCode());
      lRec.addCondition("deliveryTypeCode", test.getDeliveryTypeCode());
      lRec.addCondition("prefectureCode", test.getPrefectureCode());
      
      lRec.add("Size1", test.getSize1());
      lRec.add("Size2", test.getSize2());
      lRec.add("Size3", test.getSize3());
      lRec.add("Size4", test.getSize4());
      lRec.add("Size5", test.getSize5());
      lRec.add("Size6", test.getSize6());
      lRec.add("Size7", test.getSize7());
      lRec.add("Size8", test.getSize8());
      lRec.add("Size9", test.getSize9());
      lRec.add("Size10", test.getSize10());
      lRec.execute(connection);
    }
    
    lRec = new SIModifyRec("FeeRuleMTbl");
    
    lRec.addCondition("mallshopcode", regEdit.getMallShopCode());
    lRec.addCondition("deliveryTypeCode", regEdit.getDeliveryTypeCode());
    lRec.add("FreeFlg", regEdit.getFreeFlg());
    lRec.add("Price", regEdit.getPrice());
    lRec.add("SpPrice1", regEdit.getSpPrice1());
    lRec.add("SpPrice2", regEdit.getSpPrice2());
    lRec.add("MultiBuyFlg", regEdit.getMultiBuyFlg());
    lRec.add("UnitPrice", regEdit.getUnitPrice());
    
    log.debug("update sql=" + lRec.getSQL());
    
    lRec.execute(connection);
    try{connection.commit();}catch(SQLException sqle){throw new SIDBAccessException("update data error.");}
  }
}
