/**
 * 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.UIConnCmdtyListCond;
import jp.co.sint.beans.mallmgr.UIRegConnCmdty;
import jp.co.sint.config.SIConfig;
import jp.co.sint.database.SIDBAccessException;
import jp.co.sint.database.SIDBUtil;
import jp.co.sint.database.SIDatabaseConnection;
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.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 jp.co.sint.tools.SIStringUtil;
import jp.co.sint.tools.SIUtil;

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

/**
 * @version $Id: SIRegConnCmdtySrv.java,v 1.0 2003/09/29 Exp $
 * @author  Jinwang Chen
 * <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>
 * Jinwang Chen   2003/09/29 13:59:08  Original
 */
public class SIRegConnCmdtySrv 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 {
      String actionName=this.getActionName(urlParam);//画面からのアクション	//7.1.1 ST0236 修正
      String editMode=this.getEditMode(urlParam);//DBへの編集モード	//7.1.1 ST0236 修正
      
      UIRegConnCmdty regConnCmdty=new UIRegConnCmdty();
      UIConnCmdtyListCond connCmdtyList=new UIConnCmdtyListCond();
      session.removeAttribute(SIConfig.SISESSION_MAN_CONN_CMDTY_EDIT_NAME);
      
      if (SIConfig.SIACTION_DELETE.equalsIgnoreCase(actionName)){//レコードの削除
        //データの取得
        regConnCmdty=new UIRegConnCmdty();
        regConnCmdty.initDelete(request,urlParam);//7.1.1 ST0236 修正
        try {
          deleteTableData(databaseConnection.getConnection(),regConnCmdty);
          request.setAttribute(SIConfig.SIMESSAGE_ATTRIBUTE_RESULT_NAME,SIErrorFactory.getErrorMsg("manager.message.success.delete"));
          try {databaseConnection.getConnection().commit();}catch(SQLException sqle){}
        } catch (SIDBAccessException sqle) {
          try {databaseConnection.getConnection().rollback();}catch(SQLException ee){}
          sqle.printStackTrace();
          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.connCmdty.list");
      }else if (SIConfig.SIACTION_LIST.equalsIgnoreCase(actionName)){//一覧の画面
        //データの取得とデータのチェック
        connCmdtyList.init(request,databaseConnection.getConnection(),urlParam);//7.1.1 ST0236 修正
        session.setAttribute(SIConfig.SISESSION_MAN_CONN_CMDTY_LIST_NAME,connCmdtyList);
        forwardKey(request,response,"webshop.jsp.manager.connCmdty.list");
      }else if (SIConfig.SIACTION_MODIFY.equalsIgnoreCase(actionName)){//レコードの修正
        regConnCmdty.initModify(request,urlParam);//7.1.1 ST0236 修正
        if (regConnCmdty.validateModify(request)){
          try {
            updateTableData(databaseConnection.getConnection(),regConnCmdty);
            request.setAttribute(SIConfig.SIMESSAGE_ATTRIBUTE_RESULT_NAME,SIErrorFactory.getErrorMsg("manager.message.success.modify"));
            session.removeAttribute(SIConfig.SISESSION_MAN_CONN_CMDTY_EDIT_NAME);
            try {databaseConnection.getConnection().commit();}catch(SQLException sqle){}
          } catch (SIDBAccessException sqle) {
            try {databaseConnection.getConnection().rollback();}catch(SQLException ee){}
            sqle.printStackTrace();
            SICustomErrors errors=new SICustomErrors();
            errors.addError(new SICustomError("database.execute.error"));
            request.setAttribute(SIConfig.SIERROR_ATTRIBUTE_MESSAGE_KEY,errors);
          }
        }else{
          session.setAttribute(SIConfig.SISESSION_MAN_CONN_CMDTY_EDIT_NAME,regConnCmdty);
        }
        forwardKey(request,response,"webshop.jsp.manager.connCmdty.list");
      }else if (SIConfig.SIACTION_REFRESH.equalsIgnoreCase(actionName)){//レコードの再表示
        connCmdtyList.init(request,databaseConnection.getConnection(),urlParam);//7.1.1 ST0236 修正
        connCmdtyList.validate(request);//7.2.0 ST0327 追加
        session.setAttribute(SIConfig.SISESSION_MAN_CONN_CMDTY_LIST_NAME,connCmdtyList);
        forwardKey(request,response,"webshop.jsp.manager.connCmdty.edit");
      }else if (SIConfig.SIACTION_RETURN.equalsIgnoreCase(actionName)){//戻る
        forwardKey(request,response,"webshop.jsp.manager.connCmdty.list");
      }else if (SIConfig.SIACTION_SEARCH.equalsIgnoreCase(actionName)){//検索画面
        connCmdtyList.init(request,databaseConnection.getConnection(),urlParam);//7.1.1 ST0236 修正
        session.setAttribute(SIConfig.SISESSION_MAN_CONN_CMDTY_LIST_NAME,connCmdtyList);
        if (connCmdtyList.validate(request)){
          forwardKey(request,response,"webshop.jsp.manager.connCmdty.edit");
        }else{
          forwardKey(request,response,"webshop.jsp.manager.connCmdty.list");
        }
      }else{//DBへの新規レコード登録
        regConnCmdty=new UIRegConnCmdty();
        regConnCmdty.init(request,urlParam);//7.1.1 ST0236 修正
        boolean mutuallyFlg = "1".equals((String)request.getParameter("mutuallyFlg"));
        try {
          insertTableData(databaseConnection.getConnection(),regConnCmdty,mutuallyFlg);//新規レコードの登録
          request.setAttribute(SIConfig.SIMESSAGE_ATTRIBUTE_RESULT_NAME,SIErrorFactory.getErrorMsg("manager.message.success.insert"));
          try {databaseConnection.getConnection().commit();}catch(SQLException sqle){}
          //結果画面への遷移
          forwardKey(request,response,"webshop.jsp.manager.connCmdty.list");
        }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.manager.connCmdty.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,UIRegConnCmdty regConnCmdty,boolean mutuallyFlg) throws SIDBAccessException{
    String[] lConnShopCmdtyCode=regConnCmdty.getConnShopCmdtyCodeChk();
    if (lConnShopCmdtyCode==null) return;
    SIInsertRec lRec;
    String[] lShopCmdty=new String[2];
    
    for (int ii=0;ii<lConnShopCmdtyCode.length ;ii++){
      if (SIUtil.isNotNull(lConnShopCmdtyCode[ii])){
        lShopCmdty=SIStringUtil.split(lConnShopCmdtyCode[ii],SIConfig.SIWEBSHOPPING_TOKEN);
        lRec = new SIInsertRec("ConnCmdtyMTbl");
        lRec.add("ShopCode",regConnCmdty.getShopCode());
        lRec.add("CmdtyCode",regConnCmdty.getCmdtyCode());
        lRec.add("ConnShopCode",lShopCmdty[0]);
        lRec.add("ConnCmdtyCode",lShopCmdty[1]);
        lRec.add("DispOrder",regConnCmdty.getDispOrder());
        log.debug("ShopCode="+regConnCmdty.getShopCode()+",CmdtyCode="+regConnCmdty.getCmdtyCode());
        log.debug("ConnShopCode="+lShopCmdty[0]+",ConnCmdtyCode="+lShopCmdty[1]+",DispOrder="+regConnCmdty.getDispOrder());
        try{lRec.execute(lConnection);} catch (SIDuplicateKeyException sqle) {}
        if (mutuallyFlg && !SIDBUtil.hasData(lConnection, "SELECT * FROM conncmdtymtbl WHERE cmdtyCode="+SIDBUtil.SQL2Str(lShopCmdty[1])+" AND conncmdtycode="+SIDBUtil.SQL2Str(regConnCmdty.getCmdtyCode()))) {
          lRec = new SIInsertRec("ConnCmdtyMTbl");
          lRec.add("ShopCode",lShopCmdty[0]);
          lRec.add("CmdtyCode",lShopCmdty[1]);
          lRec.add("ConnShopCode",regConnCmdty.getShopCode());
          lRec.add("ConnCmdtyCode",regConnCmdty.getCmdtyCode());
          lRec.add("DispOrder",regConnCmdty.getDispOrder());
          log.debug("ShopCode="+lShopCmdty[0]+",CmdtyCode="+lShopCmdty[1]);
          log.debug("ConnShopCode="+regConnCmdty.getShopCode()+",ConnCmdtyCode="+regConnCmdty.getCmdtyCode()+",DispOrder="+regConnCmdty.getDispOrder());
          try{lRec.execute(lConnection);} catch (SIDuplicateKeyException sqle) {}
        }
      }
    }
  }
  
  /**
   * <b>updateTableData</b>
   * データベースにレコードを修正します。
   * @param lConnection DBへのコネクション
   * @param regCmdty 入力したデータ
   * @return なし
   * @throws SIDuplicateKeyException
   * @throws SIDBAccessException
   */
  private void updateTableData(Connection lConnection,UIRegConnCmdty regConnCmdty)throws SIDBAccessException{
    SIModifyRec lRec=new SIModifyRec("ConnCmdtyMTbl");
    try {
      lRec.addCondition("ShopCode",regConnCmdty.getShopCode());//ショップコード
      lRec.addCondition("CmdtyCode",regConnCmdty.getCmdtyCode());//商品コード
      lRec.addCondition("ConnShopCode",regConnCmdty.getConnShopCode());//ショップコード
      lRec.addCondition("ConnCmdtyCode",regConnCmdty.getConnCmdtyCode());//商品コード
      
      lRec.add("DispOrder",regConnCmdty.getDispOrder());//janコード
      //商品マスタの更新
      lRec.execute(lConnection);
    } catch (SIDuplicateKeyException sqle) {
      throw new SIDBAccessException(sqle);
    }
  }
  
  /**
   * <b>deleteTableData</b>
   * データベースからレコードを削除します。
   * @param lConnection DBへのコネクション
   * @param lErrors エラーメッセージ
   * @param cmdtyList 削除するデータ
   * @return なし
   * @throws SIDuplicateKeyException
   * @throws SIDBAccessException
   */
  private void deleteTableData(Connection lConnection,UIRegConnCmdty regConnCmdty) throws SIDBAccessException{
    SIDeleteRec lRec=new SIDeleteRec("ConnCmdtyMTbl");
    lRec.addCondition("ShopCode",regConnCmdty.getShopCode());
    lRec.addCondition("CmdtyCode",regConnCmdty.getCmdtyCode());
    lRec.addCondition("ConnShopCode",regConnCmdty.getConnShopCode());
    lRec.addCondition("ConnCmdtyCode",regConnCmdty.getConnCmdtyCode());
    
    try {
      lRec.execute(lConnection);
    } catch (SIDuplicateKeyException e) {
      throw new SIDBAccessException(e);
    }
  }
  
  public void destroy() {
  }
}