package jp.co.sint.servlet.mallmgr;

import java.io.File;
import java.io.BufferedWriter;
import java.io.FileOutputStream;
import java.io.OutputStreamWriter;
import java.io.IOException;
import java.sql.Connection;
import java.sql.Statement;
import java.sql.ResultSet;
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 org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileUploadException;

import jp.co.sint.basic.SILogin;
import jp.co.sint.beans.mallmgr.UIRegWanted;
import jp.co.sint.beans.mallmgr.UIWantedListCond;
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.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.SIDateTime;
import jp.co.sint.tools.SIErrorFactory;
import jp.co.sint.tools.SIHTMLUtil;
import jp.co.sint.tools.SIUtil;

import org.apache.log4j.Category;
import jp.co.sint.tools.SIURLParameter;

public class SIRegWantedSrv 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);
    
    try {
      Connection lConnection = databaseConnection.getConnection();
      String actionName = this.getActionName(urlParam);// 画面からのアクション
      if(SIUtil.isNull(actionName)) {
        urlParam = new SIURLParameter(request,getServletContext().getRealPath("image/wanted/temp"));//multipart/form-data専用
        actionName = (String)urlParam.getParam("actionNameTxt");
      }
      
      UIWantedListCond wantedList = new UIWantedListCond(request, lConnection);
      UIRegWanted regWanted = new UIRegWanted(request, lConnection);
      
      if (SIConfig.SIACTION_LIST.equalsIgnoreCase(actionName)) {// 一覧と検索などの画面
        // データの取得とデータのチェック
        wantedList.init(request, urlParam);
        wantedList.validate(request);
        session.setAttribute(SIConfig.SISESSION_MAN_WANTED_LIST_NAME, wantedList);
        forwardKey(request, response, "webshop.jsp.manager.wanted.list");
      } else if (SIConfig.SIACTION_BACK.equalsIgnoreCase(actionName)) {
        forwardKey(request, response, "webshop.jsp.manager.wanted.list");
      } else if (SIConfig.SIACTION_BACK2.equalsIgnoreCase(actionName)) {
        regWanted.init(request, urlParam);
        session.setAttribute(SIConfig.SISESSION_MAN_WANTED_EDIT_NAME, regWanted);
        forwardKey(request, response, "webshop.jsp.manager.wanted.edit");
      } else if (SIConfig.SIACTION_DETAIL.equalsIgnoreCase(actionName)) {// 詳細画面への遷移
        regWanted.reset(lConnection);
        session.setAttribute(SIConfig.SISESSION_MAN_WANTED_EDIT_NAME, regWanted);
        forwardKey(request, response, "webshop.jsp.manager.wanted.edit");
      } else if (SIConfig.SIACTION_NEW.equalsIgnoreCase(actionName)) {// 新規作成画面への遷移
        session.setAttribute(SIConfig.SISESSION_MAN_WANTED_EDIT_NAME, regWanted);
        forwardKey(request, response, "webshop.jsp.manager.wanted.edit");
      } else if (SIConfig.SIACTION_PREVIEW.equalsIgnoreCase(actionName)) {// プレビュー
      
      } else if (SIConfig.SIACTION_CONFIRM.equalsIgnoreCase(actionName)) {// 確認
        regWanted.init(request, urlParam);
        boolean check = false;
        
        if (regWanted.isModifyMode())
          check = regWanted.validateModify(request, lConnection);// 更新チェック
        else
          check = regWanted.validateInsert(request, lConnection);// 新規チェック
          
        if (check) {
          regWanted.initImage(urlParam, doUpload(urlParam));
          session.setAttribute(SIConfig.SISESSION_MAN_WANTED_EDIT_NAME, regWanted);
          forwardKey(request, response, "webshop.jsp.manager.wanted.confirm");
        } else {
          regWanted.initImage(urlParam, doUpload(urlParam));
          session.setAttribute(SIConfig.SISESSION_MAN_WANTED_EDIT_NAME, regWanted);
          forwardKey(request, response, "webshop.jsp.manager.wanted.edit");
        }
      } else if (SIConfig.SIACTION_REGIST.equalsIgnoreCase(actionName)) {// レコードの登録
        regWanted.init(request, urlParam);
        try {
          if (regWanted.isModifyMode()) {// 更新
            updateTableData(databaseConnection.getConnection(), regWanted);
            request.setAttribute(SIConfig.SIMESSAGE_ATTRIBUTE_RESULT_NAME, SIErrorFactory.getErrorMsg("manager.message.success.modify"));
          } else {// 新規作成
            String keyCode = insertTableData(databaseConnection.getConnection(), regWanted);
            regWanted.setKeyCode(keyCode);
            regWanted.setKeyBranch("1");
            request.setAttribute(SIConfig.SIMESSAGE_ATTRIBUTE_RESULT_NAME, SIErrorFactory.getErrorMsg("manager.message.success.insert"));
          }
          try {databaseConnection.getConnection().commit();} catch (SQLException sqle) {}
          session.setAttribute(SIConfig.SISESSION_MAN_WANTED_EDIT_NAME, regWanted);
          forwardKey(request, response, "webshop.jsp.manager.wanted.result");
        } catch (SIDBAccessException e) {
          try {databaseConnection.getConnection().rollback();} catch (SQLException sqle) {}
          session.setAttribute(SIConfig.SISESSION_MAN_WANTED_EDIT_NAME, regWanted);
          SICustomErrors errors = new SICustomErrors();
          errors.addError(new SICustomError("database.execute.error"));
          request.setAttribute(SIConfig.SIERROR_ATTRIBUTE_MESSAGE_KEY_BAK, errors);
          forwardKey(request, response, "webshop.jsp.manager.wanted.edit");
        }
      } else if (SIConfig.SIACTION_DELETE.equalsIgnoreCase(actionName)) {// レコードの削除
        regWanted.init(request, urlParam);
        try {
          deleteTableData(databaseConnection.getConnection(), regWanted);
          request.setAttribute(SIConfig.SIMESSAGE_ATTRIBUTE_RESULT_NAME, SIErrorFactory.getErrorMsg("manager.message.success.delete"));
          try {databaseConnection.getConnection().commit();} catch (SQLException sqle) {}
          forwardKey(request, response, "webshop.jsp.manager.wanted.list");
        } catch (SIDBAccessException e) {
          try {databaseConnection.getConnection().rollback();} catch (SQLException sqle) {}
          SICustomErrors errors = new SICustomErrors();
          errors.addError(new SICustomError("database.execute.error"));
          request.setAttribute(SIConfig.SIERROR_ATTRIBUTE_MESSAGE_KEY_BAK, errors);
          forwardKey(request, response, "webshop.jsp.manager.wanted.list");
        }
      }
    } 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 regColor 入力したデータ
   * @return なし
   * @throws SIDuplicateKeyException
   * @throws SIDBAccessException
   */
  private String insertTableData(Connection lConnection, UIRegWanted regWanted) throws SIDBAccessException {
    SIDateTime lDate = new SIDateTime();
    String keyCode = "";
    try {
      keyCode = SIDBUtil.getFirstData(lConnection, "SELECT max(keyCode)+1 FROM wantedTbl");
      if (SIUtil.isNull(keyCode)) keyCode = "1";
      
      SIInsertRec lRec = new SIInsertRec("wantedTbl");
      lRec.add("keyCode", keyCode);
      lRec.add("keyBranch", "1");
      lRec.add("cmdtyName", regWanted.getCmdtyName());
      lRec.add("dispValue", regWanted.getDispValue());
      lRec.add("memo", regWanted.getMemo());
      lRec.add("enableFlg", "1");
      lRec.add("branchCode", regWanted.getBranchCode());
      lRec.add("initDateTime", lDate.getFullDateTime());
      lRec.add("updateDateTime", lDate.getFullDateTime());
      lRec.add("initUser", regWanted.getUpdateUser());
      lRec.add("updateUser", regWanted.getUpdateUser());
      
      lRec.execute(lConnection);
      
      if(SIUtil.isNotNull(regWanted.getTempImageName())){
        doRename("temp/"+regWanted.getTempImageName(),"wanted"+keyCode+".jpg");
      }
      
      createXML(lConnection);
    } catch (SIDuplicateKeyException e) {
      e.printStackTrace();
      throw new SIDBAccessException();
    }
    return keyCode;
  }
  
  /**
   * <b>updateTableData</b> データベースにレコードを修正します。
   * 
   * @param lConnection DBへのコネクション
   * @param regColor 入力したデータ
   * @return なし
   * @throws SIDuplicateKeyException
   * @throws SIDBAccessException
   */
  private void updateTableData(Connection lConnection, UIRegWanted regWanted) throws SIDBAccessException {
    SIDateTime lDate = new SIDateTime();
    
    SIModifyRec lRec1 = new SIModifyRec("wantedTbl");
    lRec1.addCondition("keyCode", regWanted.getKeyCode());
    lRec1.addCondition("keyBranch", regWanted.getKeyBranch());
    lRec1.add("enableFlg", "0");
    lRec1.add("updateDateTime", lDate.getFullDateTime());
    lRec1.add("updateUser", regWanted.getUpdateUser());
    
    SIInsertRec lRec2 = new SIInsertRec("wantedTbl");
    lRec2.add("keyCode", regWanted.getKeyCode());
    lRec2.add("keyBranch", SIUtil.add(regWanted.getKeyBranch(), "1"));
    lRec2.add("cmdtyName", regWanted.getCmdtyName());
    lRec2.add("dispValue", regWanted.getDispValue());
    lRec2.add("memo", regWanted.getMemo());
    lRec2.add("enableFlg", "1");
    lRec2.add("branchCode", regWanted.getBranchCode());
    lRec2.add("initDateTime", lDate.getFullDateTime());
    lRec2.add("updateDateTime", lDate.getFullDateTime());
    lRec2.add("initUser", regWanted.getUpdateUser());
    lRec2.add("updateUser", regWanted.getUpdateUser());
    
    try {
      lRec1.execute(lConnection);
      lRec2.execute(lConnection);
      
      if(SIUtil.isNotNull(regWanted.getTempImageName())){
        doRename("temp/"+regWanted.getTempImageName(),"wanted"+regWanted.getKeyCode()+".jpg");
      }
      
      createXML(lConnection);
    } catch (SIDuplicateKeyException e) {
      e.printStackTrace();
      throw new SIDBAccessException();
    }
  }
  
  /**
   * <b>deleteTableData</b> データベースにレコードを削除します。
   * 
   * @param lConnection DBへのコネクション
   * @param regColor 削除するデータ
   * @return なし
   * @throws SIDuplicateKeyException
   * @throws SIDBAccessException
   */
  private void deleteTableData(Connection lConnection, UIRegWanted regWanted) throws SIDBAccessException {
    SIDateTime lDate = new SIDateTime();
    
    SIModifyRec lRec = new SIModifyRec("wantedTbl");
    lRec.addCondition("keyCode", regWanted.getKeyCode());
    lRec.addCondition("keyBranch", regWanted.getKeyBranch());
    lRec.add("enableFlg", "0");
    lRec.add("updateDateTime", lDate.getFullDateTime());
    lRec.add("updateUser", regWanted.getUpdateUser());
    try {
      lRec.execute(lConnection);
      createXML(lConnection);
    } catch (SIDuplicateKeyException e) {
      e.printStackTrace();
      throw new SIDBAccessException();
    }
  }
  
  // xml作成
  // ファイルアップロード
  public String doUpload(SIURLParameter urlParam) throws ServletException, IOException {
    String path = getServletContext().getRealPath("image/wanted/temp");
    if(SIUtil.isNull((String)urlParam.getParam("filedata"))) return "";
    SIDateTime lDate = new SIDateTime();
    String lFileName = lDate.getDateTimeString() + ".jpg";
    boolean up = false;
    
    try {
      FileItem objFi = (FileItem) urlParam.getParam("filedata_data");
      if (objFi != null && !objFi.isFormField()){
        objFi.write(new File(path + "/" + lFileName));
        up = true;
      }
    } catch (FileUploadException e) {
      e.printStackTrace();
    } catch (Exception e) {
      e.printStackTrace();
    }
    if (!up) return "";
    return lFileName;
  }
  
  private boolean doRename(String lFileName1,String lFileName2){
    String path = getServletContext().getRealPath("image/wanted");
    java.io.File file1 = new java.io.File(path + "/" + lFileName1);
    java.io.File file2 = new java.io.File(path + "/" + lFileName2);
    boolean ret = file1.renameTo(file2);
    return ret;
  }
  
  private void createXML(Connection lConnection) {
    String path = getServletContext().getRealPath("image/wanted");
    try {
      FileOutputStream fileOutputStream = new FileOutputStream(path + "/wanted.xml");
      OutputStreamWriter outputStreamWriter = new OutputStreamWriter(fileOutputStream,SIConfig.SIENCODE_SHIFT_JIS);
      BufferedWriter bufferedWriter = new BufferedWriter(outputStreamWriter);
      
      StringBuffer data = new StringBuffer();
      data.append("<?xml version=\"1.0\" encoding=\"Windows-31J\"?>\r\n");
      data.append("<wanteditems>\r\n");
      data.append("  <subject>買取強化商品</subject>\r\n");
      
      Statement lStatement = lConnection.createStatement();
      ResultSet lResultSet = lStatement.executeQuery("SELECT * FROM wantedtbl WHERE enableflg=1 ORDER BY initdatetime DESC LIMIT 40");
      
      while(lResultSet.next()) {
        data.append("  <item>\r\n");
        data.append("    <name>").append(lResultSet.getString("cmdtyName")).append("</name>\r\n");
        data.append("    <price>").append(lResultSet.getString("dispValue")).append("</price>\r\n");
        data.append("    <description><![CDATA[").append(SIHTMLUtil.ToHTMLNewLine2(lResultSet.getString("memo"))).append("]]></description>\r\n");
        
        File imageFile = new File(getServletContext().getRealPath("image/wanted/wanted" + lResultSet.getShort("keyCode") + ".jpg"));
        
        String imagePath = "http://www.beautygarage.jp/ws/image/wanted/wanted" + lResultSet.getShort("keyCode") + ".jpg";
        String noImagePath = "http://www.beautygarage.jp/ws/image/wanted/noImage.jpg";
        
        if (imageFile.exists()) {
          data.append("    <image>").append(imagePath).append("</image>\r\n");
        } else {
          data.append("    <image>").append(noImagePath).append("</image>\r\n");
        }
        data.append("  </item>\r\n");
      }
      
      data.append("</wanteditems>\r\n");
      bufferedWriter.write(data.toString());
      bufferedWriter.close();
      outputStreamWriter.close();
      fileOutputStream.close();
    } catch (Exception ex) {
      ex.printStackTrace();
    }
  }
  
  public void destroy() {
  }
}
