/**
 * 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 java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;

import javax.naming.NamingException;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import jp.co.sint.basic.SICmdtyStndrd;
import jp.co.sint.basic.SICmdtyStndrdUtil;
import jp.co.sint.basic.SILogin;
import jp.co.sint.beans.mallmgr.UICmdtyStndrdListCond;
import jp.co.sint.beans.mallmgr.UIRegCmdtyStndrd;
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.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.SIFileUtil;
import jp.co.sint.tools.SIHTMLUtil;
import jp.co.sint.tools.SIUtil;

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

/**
 * @version $Id: SIRegCmdtyStndrdSrv.java,v 1.0 2003/09/16 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>
 * xxxxx          2003/09/16  Original
 */

public class SIRegCmdtyStndrdSrv 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 修正

      UICmdtyStndrdListCond cmdtyStndrdList=new UICmdtyStndrdListCond();//規格選択の部分
      UIRegCmdtyStndrd regCmdtyStndrd=new UIRegCmdtyStndrd();//在庫数量と画像ファイルの入力の部分

      if (SIConfig.SIACTION_LIST.equalsIgnoreCase(actionName)){//規格の選択
        //入力したデータのクリア
        session.removeAttribute(SIConfig.SISESSION_MAN_CMDTY_STNDRD_EDIT_NAME);

		cmdtyStndrdList.init(request,databaseConnection.getConnection(),urlParam);//7.1.1 ST0236 修正
        cmdtyStndrdList.validate(request);
        session.setAttribute(SIConfig.SISESSION_MAN_CMDTY_STNDRD_LIST_NAME,cmdtyStndrdList);
        forwardKey(request,response,"webshop.jsp.manager.cmdtyStndrd.edit");
      }else if (SIConfig.SIACTION_NEW.equalsIgnoreCase(actionName)){//商品マスタ画面から、新規登録と既存の修正など
        cmdtyStndrdList=new UICmdtyStndrdListCond();
		cmdtyStndrdList.reset( request,databaseConnection.getConnection(),urlParam);//7.1.1 ST0236 修正
        session.setAttribute(SIConfig.SISESSION_MAN_CMDTY_STNDRD_LIST_NAME,cmdtyStndrdList);
        forwardKey(request,response,"webshop.jsp.manager.cmdtyStndrd.edit");
      }else if (SIConfig.SIACTION_REMODIFY.equalsIgnoreCase(actionName)){//再修正へ
        forwardKey(request,response,"webshop.jsp.manager.cmdtyStndrd.edit");
      }else if (SIConfig.SIACTION_RESET.equalsIgnoreCase(actionName)){//画面からリセット
        cmdtyStndrdList=new UICmdtyStndrdListCond();
		cmdtyStndrdList.reset( request,databaseConnection.getConnection(),urlParam);//7.1.1 ST0236 修正
        session.setAttribute(SIConfig.SISESSION_MAN_CMDTY_STNDRD_LIST_NAME,cmdtyStndrdList);
        forwardKey(request,response,"webshop.jsp.manager.cmdtyStndrd.edit");
      }else if (SIConfig.SIACTION_CONFIRM.equalsIgnoreCase(actionName)){//データの確認画面へ
        //インスタンスの作成
        regCmdtyStndrd=new UIRegCmdtyStndrd();

        //データの取得
		regCmdtyStndrd.init(request,urlParam);//7.1.1 ST0236 修正
        session.setAttribute(SIConfig.SISESSION_MAN_CMDTY_STNDRD_EDIT_NAME,regCmdtyStndrd);

        //データのチェック
        if (regCmdtyStndrd.validate(request))forwardKey(request,response,"webshop.jsp.manager.cmdtyStndrd.confirm");
        else forwardKey(request,response,"webshop.jsp.manager.cmdtyStndrd.edit");
      }else{//DBへのデータ登録
        //セッションから入力データと基本データを取得します。
        regCmdtyStndrd=(UIRegCmdtyStndrd)session.getAttribute(SIConfig.SISESSION_MAN_CMDTY_STNDRD_EDIT_NAME);
        cmdtyStndrdList=(UICmdtyStndrdListCond)session.getAttribute(SIConfig.SISESSION_MAN_CMDTY_STNDRD_LIST_NAME);
        //
        try {
          //いつも新規レコードの作成
          insertTableData(databaseConnection.getConnection(),regCmdtyStndrd,cmdtyStndrdList,this.context);
          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.cmdtyStndrd.result");
        }catch(SIDuplicateKeyException sqle){
          try {databaseConnection.getConnection().rollback();}catch(SQLException ee){}
          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.cmdtyStndrd.edit");
        }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.cmdtyStndrd.edit");
      }catch(Exception e){
        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.cmdtyStndrd.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 regCmdtyStndrd 入力したデータのクラス
   * @param cmdtyStndrdListCond 規格の選択の部分のクラス
   * @return なし
   * @throws SIDuplicateKeyException
   * @throws SIDBAccessException
   */
  public static void insertTableData(Connection lConnection,UIRegCmdtyStndrd regCmdtyStndrd,UICmdtyStndrdListCond cmdtyStndrdListCond,ServletContext context) throws SIDuplicateKeyException,SIDBAccessException{
		//現在のレコードを保持
		Collection collOld = (new UICmdtyStndrdListCond()).getCurrentStndrdCollection(lConnection,cmdtyStndrdListCond.getShopCode(),cmdtyStndrdListCond.getCmdtyCode());
		Collection collNew = new ArrayList();

		//既存のレコードがあれば、削除します。
		StringBuffer lSqlBuf=new StringBuffer();
		lSqlBuf.append("DELETE FROM CmdtyStndrdMTbl ");
		lSqlBuf.append( "WHERE ShopCode="+SIDBUtil.SQL2Str(cmdtyStndrdListCond.getShopCode()," "));
		lSqlBuf.append( "AND  CmdtyCode="+SIDBUtil.SQL2Str(cmdtyStndrdListCond.getCmdtyCode()," "));
		//lSqlBuf.append( "AND (StndrdCode1 IS NOT NULL OR ElementCode1 IS NOT NULL ");
		//lSqlBuf.append( "OR StndrdCode2 IS NOT NULL OR ElementCode2 IS NOT NULL) ");
		//削除の実行
		SIDeleteRec lRec=new SIDeleteRec();
		lRec.setSQL(lSqlBuf.toString());
		lRec.execute(lConnection);

		//新しいレコードの作成
		SIInsertRec lInsertRec=new SIInsertRec();
		SICmdtyStndrdUtil lCSUtil=new SICmdtyStndrdUtil();

		Iterator lCmdtyStndrdIta=cmdtyStndrdListCond.getCollection(lConnection).iterator();
		SICmdtyStndrd cmdtyStndrd=new SICmdtyStndrd();

		while (lCmdtyStndrdIta.hasNext()){
			cmdtyStndrd=(SICmdtyStndrd)lCmdtyStndrdIta.next();
			lCSUtil=new SICmdtyStndrdUtil(cmdtyStndrd.getStndrdCode1(),
			                              cmdtyStndrd.getElementCode1(),
			                              cmdtyStndrd.getStndrdCode2(),
			                              cmdtyStndrd.getElementCode2());
			if (SIUtil.isNotNull(regCmdtyStndrd.getValue(lCSUtil.getCheckBoxName()))){
				lInsertRec=new SIInsertRec("CmdtyStndrdMTbl");
				lInsertRec.add("ShopCode",cmdtyStndrdListCond.getShopCode());
				lInsertRec.add("CmdtyCode",cmdtyStndrdListCond.getCmdtyCode());

				lInsertRec.add("StndrdCode1",cmdtyStndrdListCond.getStndrdCodeSel1());
				lInsertRec.add("ElementCode1",cmdtyStndrd.getElementCode1());

				lInsertRec.add("StndrdCode2",cmdtyStndrdListCond.getStndrdCodeSel2());
				lInsertRec.add("ElementCode2",cmdtyStndrd.getElementCode2());

				lInsertRec.add("Amount",regCmdtyStndrd.getValue(lCSUtil.getAmountName()));
				lInsertRec.execute(lConnection);

				//登録したレコードを保持する
				SICmdtyStndrd lCmdtyStndrd=new SICmdtyStndrd();
				lCmdtyStndrd.setEncode(SIConfig.SIENCODE_NONE);
				lCmdtyStndrd.setStndrdCode1(cmdtyStndrdListCond.getStndrdCodeSel1());
				lCmdtyStndrd.setElementCode1(cmdtyStndrd.getElementCode1());
				lCmdtyStndrd.setStndrdCode2(cmdtyStndrdListCond.getStndrdCodeSel2());
				lCmdtyStndrd.setElementCode2(cmdtyStndrd.getElementCode2());
				collNew.add(lCmdtyStndrd);
			}
		}

		//古にあって新にない画像を削除
		SIFileUtil fileUtil = new SIFileUtil(lConnection,context,cmdtyStndrdListCond.getShopCode());

		Iterator itaOld=collOld.iterator();
		while(itaOld.hasNext()){
			SICmdtyStndrd oldStndrd =(SICmdtyStndrd)itaOld.next();
			Iterator itaNew=collNew.iterator();
			boolean flg = false;

			while(itaNew.hasNext()){
				SICmdtyStndrd newStndrd =(SICmdtyStndrd)itaNew.next();
				if(oldStndrd.getStndrdCode1().equals(newStndrd.getStndrdCode1())
				&& oldStndrd.getElementCode1().equals(newStndrd.getElementCode1())
				&& oldStndrd.getStndrdCode2().equals(newStndrd.getStndrdCode2())
				&& oldStndrd.getElementCode2().equals(newStndrd.getElementCode2())){
					flg = true;
					break;
				}
			}

			if(!flg){
				fileUtil.delStndrdAll(cmdtyStndrdListCond.getCmdtyCode(),oldStndrd.getStndrdCode1(),oldStndrd.getElementCode1(),oldStndrd.getStndrdCode2(),oldStndrd.getElementCode2());
			}
		}

  }

  public void destroy() {
  }
}
