/**
 * 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.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.SIDeliveryArea;
import jp.co.sint.basic.SILogin;
import jp.co.sint.beans.mallmgr.UIRegDeliveryArea;
import jp.co.sint.config.SIConfig;
import jp.co.sint.database.SIDBAccessException;
import jp.co.sint.database.SIDatabaseConnection;
import jp.co.sint.database.SIDeleteRec;
import jp.co.sint.database.SIDuplicateKeyException;
import jp.co.sint.database.SIModifyRec;
import jp.co.sint.database.SIPrepared;
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 SIRegDeliveryAreaSrv 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 追加
    try{
      Connection connection=databaseConnection.getConnection();;

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

      UIRegDeliveryArea regEdit = new UIRegDeliveryArea();

      if(SIConfig.SIACTION_MODIFY.equalsIgnoreCase(actionName)){//一覧と検索などの画面
        //データの取得とデータのチェック
        regEdit.init(request,urlParam);//7.1.1 ST0236 修正
        forwardKey(request, response, "webshop.jsp.manager.deliveryarea.edit");
      }else if(SIConfig.SIACTION_REMODIFY.equalsIgnoreCase(actionName)){//一覧と検索などの画面
        //データの取得とデータのチェック
        regEdit = (UIRegDeliveryArea) session.getAttribute(SIConfig.SISESSION_MAN_DELIVERY_AREA_EDIT_NAME);
        regEdit.setActionNameTxt(actionName);
        session.setAttribute(SIConfig.SISESSION_MAN_DELIVERY_AREA_EDIT_NAME, regEdit);
        forwardKey(request, response, "webshop.jsp.manager.deliveryarea.edit");
      }else if(SIConfig.SIACTION_CONFIRM.equalsIgnoreCase(actionName)){//一覧と検索などの画面
        //データの取得とデータのチェック
        regEdit.init(request,urlParam);//7.1.1 ST0236 修正
        //データのチェック
        if(regEdit.validate(request, connection) == false){
          regEdit.setActionNameTxt(SIConfig.SIACTION_REMODIFY);
          session.setAttribute(SIConfig.SISESSION_MAN_DELIVERY_AREA_EDIT_NAME, regEdit);
          forwardKey(request, response, "webshop.jsp.manager.deliveryarea.edit");
        }else{
          session.setAttribute(SIConfig.SISESSION_MAN_DELIVERY_AREA_EDIT_NAME, regEdit);
          regEdit = (UIRegDeliveryArea) session.getAttribute(SIConfig.SISESSION_MAN_DELIVERY_AREA_EDIT_NAME);
          forwardKey(request, response, "webshop.jsp.manager.deliveryarea.confirm");
        }
      }else{
        //DBへのデータ登録
        //データの取得
        regEdit = (UIRegDeliveryArea) session.getAttribute(SIConfig.SISESSION_MAN_DELIVERY_AREA_EDIT_NAME);
        regEdit.setActionNameTxt(actionName);
        regEdit.setEditModeTxt(editMode);
        session.setAttribute(SIConfig.SISESSION_MAN_DELIVERY_AREA_EDIT_NAME, regEdit);
        //データのチェック
        if(regEdit.validate(request, connection) == false){
          regEdit.setActionNameTxt(SIConfig.SIACTION_REMODIFY);
          session.setAttribute(SIConfig.SISESSION_MAN_DELIVERY_AREA_EDIT_NAME, regEdit);
          forwardKey(request, response, "webshop.jsp.manager.deliveryarea.edit");
        }else{
          try{
            if(editMode.equalsIgnoreCase(SIConfig.SIEDIT_MODE_UPDATE)){
              deleteTableData(connection, regEdit);
              insertTableData(connection, regEdit);
              updateTableData(connection, regEdit);
              try{connection.commit();}catch (SQLException sqle){throw new SIDBAccessException("delete data error.");}
              request.setAttribute(SIConfig.SIMESSAGE_ATTRIBUTE_RESULT_NAME,SIErrorFactory.getErrorMsg("manager.message.success.insert"));
              forwardKey(request, response, "webshop.jsp.manager.deliveryarea.result");
            }else{
              regEdit.setActionNameTxt(SIConfig.SIACTION_REMODIFY);
              session.setAttribute(SIConfig.SISESSION_MAN_DELIVERY_AREA_EDIT_NAME, regEdit);
              forwardKey(request, response, "webshop.jsp.manager.deliveryarea.edit");
            }
          }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.deliveryarea.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.deliveryarea.edit");
          }
        }
      }
    }catch (SQLException e){
      e.printStackTrace();
      throw new ServletException();
    }catch (NamingException e){
      e.printStackTrace();
      throw new ServletException();
    }finally{
      databaseConnection.close();
    }
  }

  /**
   * insertTableData
   * データベースにレコードを修正します。
   * @param
   * @return
   * @throws
   */
  private void insertTableData(Connection connection, UIRegDeliveryArea regEdit) throws SIDuplicateKeyException, SIDBAccessException {
    //SISpcType lSpcType = new SISpcType();
    SIPrepared lRec=new  SIPrepared("table.deliveryArea.insert.sql");
    Collection regUpd = regEdit.reset2(connection);
    SIDeliveryArea test = new SIDeliveryArea();
    Iterator testIta = regUpd.iterator();

    String postCodeAll[];

    while (testIta.hasNext()){
      test = (SIDeliveryArea) testIta.next();
      postCodeAll = test.getPostCodeAll().split(",");

      for(int ii = 0; ii < postCodeAll.length; ii++){
        lRec=new  SIPrepared("table.deliveryArea.insert.sql");
        if(postCodeAll[ii].split("-", 2).length == 2){
          lRec.add(test.getMallShopCode());
          lRec.add(Integer.parseInt(test.getDeliveryTypeCode()));//修正 postgres8.x対応

          lRec.add(Integer.parseInt(test.getPrefectureCode()));
          lRec.add(postCodeAll[ii].split("-", 2)[0]);
          lRec.add(postCodeAll[ii].split("-", 2)[1]);

          lRec.execute(connection);
        }
      }
    }
  }

  /**
   * updateTableData
   * データベースにレコードを修正します。
   * @param
   * @return
   * @throws
   */
  private void updateTableData(Connection connection, UIRegDeliveryArea regEdit) throws SIDuplicateKeyException, SIDBAccessException {
    //SISpcType lSpcType = new SISpcType();
    SIModifyRec lRec = new SIModifyRec("spcdeliveryMtbl");
    Collection regUpd = regEdit.reset2(connection);
    SIDeliveryArea test = new SIDeliveryArea();
    Iterator testIta = regUpd.iterator();

    while (testIta.hasNext()){
      test = (SIDeliveryArea) testIta.next();
      lRec = new SIModifyRec("deliveryfeeMtbl");

      lRec.addCondition("mallshopcode", test.getMallShopCode());
      lRec.addCondition("deliverytypecode", Integer.parseInt(test.getDeliveryTypeCode()));

      lRec.addCondition("prefectureCode", Integer.parseInt(test.getPrefectureCode()));
      lRec.add("prefecturename", test.getPrefectureName());

      lRec.execute(connection);
    }
  }

  /**
   * deleteTableData
   * データベースにレコードを作成します。
   * @param
   * @return
   * @throws
   */
  public void deleteTableData(Connection connection, UIRegDeliveryArea regEdit) throws SIDuplicateKeyException, SIDBAccessException {
    SIDeleteRec lRec = new SIDeleteRec("spcdeliveryMtbl");
    Collection regUpd = regEdit.reset2(connection);
    SIDeliveryArea test = new SIDeliveryArea();
    Iterator testIta = regUpd.iterator();

    while (testIta.hasNext()){
      test = (SIDeliveryArea) testIta.next();
      lRec = new SIDeleteRec("spcdeliveryMtbl");

      lRec.addCondition("mallshopcode", test.getMallShopCode());
      lRec.addCondition("prefectureCode", Integer.parseInt(test.getPrefectureCode()));
      lRec.addCondition("deliverytypecode", Integer.parseInt(test.getDeliveryTypeCode()));

      lRec.execute(connection);
    }
  }

  public void destroy(){
  }
  
}
