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

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

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.basic.SIMaker;
import jp.co.sint.beans.mallmgr.UICmdtyListCond;
import jp.co.sint.beans.mallmgr.UIMakerListCond;
import jp.co.sint.beans.mallmgr.UIRegMaker;
import jp.co.sint.config.SICSVConf;
import jp.co.sint.config.SIConfig;
import jp.co.sint.config.SIDBMultiConf;
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.SICSVWrite;
import jp.co.sint.tools.SICustomError;
import jp.co.sint.tools.SICustomErrors;
import jp.co.sint.tools.SIDateTime;
import jp.co.sint.tools.SIErrorFactory;
import jp.co.sint.tools.SIHTMLUtil;
import jp.co.sint.tools.SIURLParameter;
import jp.co.sint.tools.SIUtil;

import org.apache.log4j.Category;

public class SIRegMakerSrv 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);// セッションの取得
    
    UIRegMaker regMaker = new UIRegMaker();
    UIMakerListCond makerList = new UIMakerListCond();
    SIDatabaseConnection databaseConnection = new SIDatabaseConnection();
    SIURLParameter urlParam = new SIURLParameter(request);
    try {
      Connection connection = databaseConnection.getConnection();
      
      String actionName = this.getActionName(urlParam);// 画面からのアクション
      String editMode = this.getEditMode(urlParam); // DBへの編集モード
      
      if (SIConfig.SIACTION_NEW.equalsIgnoreCase(actionName)) {
        session.removeAttribute(SIConfig.SISESSION_MAN_MAKER_EDIT_NAME);
        forwardKey(request, response, "webshop.jsp.manager.maker.edit");
      } else if (SIConfig.SIACTION_REFRESH.equalsIgnoreCase(actionName)) {
        if (SIConfig.SIEDIT_MODE_UPDATE.equals(editMode)) {
          regMaker.setRegMakerCode((String) urlParam.getParam("makerCode"));
          regMaker.reset(connection);
          session.setAttribute(SIConfig.SISESSION_MAN_MAKER_EDIT_NAME, regMaker);
          forwardKey(request, response, "webshop.jsp.manager.maker.edit");
        }else{
          session.removeAttribute(SIConfig.SISESSION_MAN_MAKER_EDIT_NAME);
          forwardKey(request, response, "webshop.jsp.manager.maker.edit");
        }
      } else if (SIConfig.SIACTION_RETURN.equalsIgnoreCase(actionName)) {
        forwardKey(request, response, "webshop.jsp.manager.maker.list");
      } else if (SIConfig.SIACTION_BACK.equalsIgnoreCase(actionName)) {
        forwardKey(request, response, "webshop.jsp.manager.maker.edit");
      } else if (SIConfig.SIACTION_LIST.equalsIgnoreCase(actionName)) {// 一覧と検索などの画面
        makerList.init(request, urlParam);
        session.setAttribute(SIConfig.SISESSION_MAN_MAKER_LIST_NAME, makerList);
        forwardKey(request, response, "webshop.jsp.manager.maker.list");
      } else if (SIConfig.SIACTION_CSV.equalsIgnoreCase(actionName)) {// CSVファイルへの出力
        makerList = (UIMakerListCond) session.getAttribute(SIConfig.SISESSION_MAN_MAKER_LIST_NAME);
          if (makerList == null) makerList = new UIMakerListCond();
          produceCSVFile(request, response, databaseConnection.getConnection(), makerList);
          if (!response.isCommitted()) {
            request.setAttribute(SIConfig.SIMESSAGE_ATTRIBUTE_RESULT_NAME, SIErrorFactory.getErrorMsg("database.query.notexist", "CSVデータ"));
            forwardKey(request, response, "webshop.jsp.manager.maker.list");
          }
      } else if (SIConfig.SIACTION_MODIFY.equals(actionName)) {
        makerList.init(request, urlParam);
        makerList.initModify(request, urlParam);
        try {
          updateFrontDisp(connection, makerList);
          request.setAttribute(SIConfig.SIMESSAGE_ATTRIBUTE_RESULT_NAME, SIErrorFactory.getErrorMsg("manager.message.success.modify"));
          try {connection.commit();} catch (SQLException sqle) {}
          session.setAttribute(SIConfig.SISESSION_MAN_MAKER_LIST_NAME, makerList);
          request.setAttribute("remodify", SIConfig.SIACTION_REMODIFY);
          forwardKey(request, response, "webshop.jsp.manager.maker.list");
        } catch (SIDuplicateKeyException sqle) {
          try {connection.rollback();} catch (SQLException e) {}
          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.maker.list");
        } catch (SIDBAccessException sqle) {
          try {connection.rollback();} catch (SQLException e) {}
          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.maker.list");
        }
      } else if (SIConfig.SIACTION_DELETE.equalsIgnoreCase(actionName)) {
        makerList.init(request, urlParam);
        makerList.initModify(request, urlParam);
        try {
          deleteTableData(makerList, connection);
          request.setAttribute(SIConfig.SIMESSAGE_ATTRIBUTE_RESULT_NAME, SIErrorFactory.getErrorMsg("manager.message.success.delete"));
          try {connection.commit();} catch (SQLException sqle) {}
          session.setAttribute(SIConfig.SISESSION_MAN_MAKER_LIST_NAME, makerList);
          request.setAttribute("remodify", SIConfig.SIACTION_REMODIFY);
          forwardKey(request, response, "webshop.jsp.manager.maker.list");
        } catch (SIDuplicateKeyException sqle) {
          try {connection.rollback();} catch (SQLException e) {}
          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.maker.list");
        } catch (SIDBAccessException sqle) {
          try {connection.rollback();} catch (SQLException e) {}
          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.maker.list");
        }
      } else if (SIConfig.SIACTION_DETAIL.equalsIgnoreCase(actionName)) {
        regMaker.setRegMakerCode((String) urlParam.getParam("regMakerCode"));
        if (regMaker.reset(connection)) {
          session.setAttribute(SIConfig.SISESSION_MAN_MAKER_EDIT_NAME, regMaker);
          forwardKey(request, response, "webshop.jsp.manager.maker.edit");
        }else{
          request.setAttribute(SIConfig.SIMESSAGE_ATTRIBUTE_RESULT_NAME, SIErrorFactory.getErrorMsg("database.query.notexist","ブランドコード"));
          forwardKey(request, response, "webshop.jsp.manager.maker.list");
        }
      } else if (SIConfig.SIACTION_CONFIRM.equalsIgnoreCase(actionName)) {
        regMaker.init(request, urlParam);
        if (regMaker.validate(request,connection)){
          session.setAttribute(SIConfig.SISESSION_MAN_MAKER_EDIT_NAME, regMaker);
          forwardKey(request, response, "webshop.jsp.manager.maker.confirm");
        }else{
          session.setAttribute(SIConfig.SISESSION_MAN_MAKER_EDIT_NAME, regMaker);
          forwardKey(request, response, "webshop.jsp.manager.maker.edit");
        }
      } else if (SIConfig.SIACTION_REGIST.equalsIgnoreCase(actionName)) {
        try {
          regMaker = (UIRegMaker) session.getAttribute(SIConfig.SISESSION_MAN_MAKER_EDIT_NAME);
          if (editMode.equalsIgnoreCase(SIConfig.SIEDIT_MODE_INSERT)) {
            insertTableData(connection, regMaker);
            request.setAttribute(SIConfig.SIMESSAGE_ATTRIBUTE_RESULT_NAME, SIErrorFactory.getErrorMsg("manager.message.success.insert"));
            try {connection.commit();} catch (SQLException sqle) {}
          } else if (editMode.equalsIgnoreCase(SIConfig.SIEDIT_MODE_UPDATE)) {
            updateTableData(connection, regMaker);
            request.setAttribute(SIConfig.SIMESSAGE_ATTRIBUTE_RESULT_NAME, SIErrorFactory.getErrorMsg("manager.message.success.modify"));
            try {connection.commit();} catch (SQLException sqle) {}
          } else {
            log.error("no known edit mode.editMode=" + editMode);
          }
          forwardKey(request, response, "webshop.jsp.manager.maker.result");
        } catch (SIDuplicateKeyException sqle) {
          try {connection.rollback();} catch (SQLException e) {}
          SICustomErrors errors = new SICustomErrors();
          errors.addError(new SICustomError("database.insert.duplicate"));
          request.setAttribute(SIConfig.SIERROR_ATTRIBUTE_MESSAGE_KEY, errors);
          errorSetting(request, regMaker, editMode);
          forwardKey(request, response, "webshop.jsp.manager.maker.edit");
        } catch (SIDBAccessException sqle) {
          try {connection.rollback();} catch (SQLException e) {}
          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.maker.edit");
        }
      } else if (SIConfig.SIACTION_SEARCH.equals(actionName)) {
        regMaker.init(request, urlParam);
        regMaker.validateList(request, connection);
        session.setAttribute(SIConfig.SISESSION_MAN_MAKER_LIST_NAME, regMaker);
        forwardKey(request, response, "webshop.jsp.manager.cmdty.makerlist");
      }
    } catch (SQLException e) {
      e.printStackTrace();
      throw new ServletException();
    } catch (NamingException e) {
      e.printStackTrace();
      throw new ServletException();
    } finally {
      databaseConnection.close();
    }
  }
  
  /**
   * <b>errorSetting</b> エラー発生時の入力値を保持します。
   * 
   * @param HttpServletRequest , UIRegMaker , String
   * @return
   * @throws
   */
  public void errorSetting(HttpServletRequest request, UIRegMaker regList, String editMode) {
    HttpSession session = request.getSession(true);// セッションの取得
    
    if (editMode.equalsIgnoreCase(SIConfig.SIEDIT_MODE_INSERT)) {
      regList.setActionNameTxt(SIConfig.SIACTION_NEW);
    } else if (editMode.equalsIgnoreCase(SIConfig.SIEDIT_MODE_UPDATE)) {
      regList.setActionNameTxt(SIConfig.SIACTION_LIST);
    }
    session.setAttribute(SIConfig.SISESSION_MAN_MAKER_LIST_NAME, regList);
    request.setAttribute("remodify", SIConfig.SIACTION_REMODIFY);
  }
  
  /**
   * <b>insertTableData</b> データベースにレコードを挿入します。
   * 
   * @param Connection
   * @param UIRegMaker
   * @return なし
   * @throws SIDuplicateKeyException
   * @throws SIDBAccessException
   */
  public static void insertTableData(Connection connection, UIRegMaker regList) throws SIDuplicateKeyException, SIDBAccessException {
    
    SIInsertRec lRec = new SIInsertRec("MakerTbl");
    SIDateTime lDateTime = new SIDateTime();
    
    lRec.add("MakerCode", regList.getRegMakerCode());
    lRec.add("MakerName", regList.getRegMakerName());
    lRec.add("OtherName1", regList.getRegOtherName1());
    lRec.add("OtherName2", regList.getRegOtherName2());
    lRec.add("Memo", regList.getRegDescription());
    lRec.add("TEL", regList.getRegTel());
    lRec.add("URL", regList.getRegUrl());
    lRec.add("InitDateTime", lDateTime.getFullDateTime());
    lRec.add("UpdateDateTime", lDateTime.getFullDateTime());
    lRec.add("EnabledFlg", regList.getRegFrontDispFlg());
    lRec.add("ContractFlg", regList.getRegContractFlg());
    lRec.add("SortOrder", regList.getRegSortOrder());
    lRec.add("ReferencePost", regList.getRegReferencePost());
    lRec.add("ReferenceNumber", regList.getRegReferenceNumber());
    lRec.add("ReferenceMail", regList.getRegReferenceMail());
    log.debug("insert sql=" + lRec.getSQL());
    lRec.execute(connection);
  }
  
  /**
   * <b>updateTableData</b> データベースのレコードを修正します。
   * 
   * @param Connection
   * @param UIRegMaker
   * @return なし
   * @throws SIDuplicateKeyException
   * @throws SIDBAccessException
   */
  public static void updateTableData(Connection connection, UIRegMaker regList) throws SIDuplicateKeyException, SIDBAccessException {
    
    SIModifyRec lRec = new SIModifyRec("MakerTbl");
    SIDateTime lDateTime = new SIDateTime();
    
    lRec.addCondition("MakerCode", regList.getRegMakerCode());
    lRec.add("MakerName", regList.getRegMakerName());
    lRec.add("OtherName1", regList.getRegOtherName1());
    lRec.add("OtherName2", regList.getRegOtherName2());
    lRec.add("Memo", regList.getRegDescription());
    lRec.add("TEL", regList.getRegTel());
    lRec.add("URL", regList.getRegUrl());
    lRec.add("UpdateDateTime", lDateTime.getFullDateTime());
    lRec.add("EnabledFlg", regList.getRegFrontDispFlg());
    lRec.add("ContractFlg", regList.getRegContractFlg());
    lRec.add("SortOrder", regList.getRegSortOrder());
    lRec.add("ReferencePost", regList.getRegReferencePost());
    lRec.add("ReferenceNumber", regList.getRegReferenceNumber());
    lRec.add("ReferenceMail", regList.getRegReferenceMail());
    log.debug("update sql=" + lRec.getSQL());
    lRec.execute(connection);
    
    if(regList.getRegContractFlg().equals("0")){
      SIDeleteRec delRec = new SIDeleteRec("CustMakerTbl");
      delRec.addCondition("MakerCode", regList.getRegMakerCode());
      delRec.execute(connection);
    }
  }
  
  public static void updateFrontDisp(Connection connection, UIMakerListCond makerList) throws SIDuplicateKeyException, SIDBAccessException {
    SIModifyRec lRec = new SIModifyRec("MakerTbl");
    SIDateTime lDateTime = new SIDateTime();
    lRec.addCondition("MakerCode", makerList.getRegMakerCode());
    lRec.add("UpdateDateTime", lDateTime.getFullDateTime());
    lRec.add("EnabledFlg", makerList.getRegFrontDispFlg());
    log.debug("update sql=" + lRec.getSQL());
    lRec.execute(connection);
  }
  
  /**
   * <b>deleteTableData</b> データを削除します。
   * 
   * @param UIRegMaker
   * @param Connection
   * @return なし
   * @throws SIDuplicateKeyException
   * @throws SIDBAccessException
   */
  public void deleteTableData(UIMakerListCond makerList, Connection connection) throws SIDuplicateKeyException, SIDBAccessException {
    
    SIDeleteRec lRec = new SIDeleteRec("MakerTbl");
    lRec.addCondition("MakerCode", makerList.getRegMakerCode());
    lRec.execute(connection);
    
    lRec = new SIDeleteRec("CustMakerTbl");
    lRec.addCondition("MakerCode", makerList.getRegMakerCode());
    lRec.execute(connection);
  }
  
  private void produceCSVFile(HttpServletRequest request, HttpServletResponse response, Connection lConnection, UIMakerListCond makerList) {
    // CSVファイル名の作成
    String lCsvFileName = SICSVConf.getCsvFileName(SICSVConf.SICSV_MAKER_LIST_INX);
    SICSVWrite lCsv = new SICSVWrite(lCsvFileName);
    
    StringBuffer lSqlBuf = new StringBuffer();
    
    lSqlBuf.append("SELECT * FROM MakerTbl a WHERE 1=1 ");
    lSqlBuf.append(makerList.getCondtionSQL());
    
    if (SIUtil.isNotNull(makerList.getSortOrderTxt())&&makerList.getSortOrderTxt().equals("1")) {
      lSqlBuf.append(" ORDER BY SortOrder ASC,MakerCode ASC");
    }else{
      lSqlBuf.append(" ORDER BY MakerCode DESC");
    }
    
    // SQL文の設定
    lCsv.setSqlStatement(lSqlBuf.toString());
    // タイトルとFieldの設定
    lCsv.setCsvTitleAndField(SICSVConf.getTitleAndFieldName(SICSVConf.SICSV_MAKER_LIST_INX));
    // CSVファイルの出力
    lCsv.execute(lConnection, response);
  }
  
  public void destroy() {}
  
}