/**
 * 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.text.SimpleDateFormat;//7.2.0 ST0546 追加
import java.util.ArrayList;
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.SIAccesslog;
import jp.co.sint.basic.SILogin;
import jp.co.sint.beans.mallmgr.UIAccesslogListCond;
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.SIDatabaseConnection;
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;//7.2.0 ST0546 追加
import jp.co.sint.tools.SIErrorFactory;
import jp.co.sint.tools.SIHTMLUtil;
import jp.co.sint.tools.SIURLParameter;//7.1.1 ST0236 追加

import org.apache.log4j.Category;


/**
 * @version $Id: SIRegAccesslogSrv.java,v 1.0 2003/09/19 Exp $
 * @author  アクセスログ分析
 * <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>
 * asakura        2003/09/19 12:20:42  Original
 */
public class SIRegAccesslogSrv 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 {
    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 修正

      SILogin lLogin=SIHTMLUtil.getLogin(request);
      if (SIConfig.SIACTION_LIST.equalsIgnoreCase(actionName)){//一覧と検索などの画面のレコードの表示
        UIAccesslogListCond listCond=new UIAccesslogListCond();
        //データの取得
        listCond.init(request,urlParam);//7.1.1 ST0236 修正
        //データのチェック
        listCond.validate(request);//7.2.0 ST0546 修正
        session.setAttribute(SIConfig.SISESSION_MAN_ACCESSLOG_LIST_NAME,listCond);
        forwardKey(request,response,"webshop.jsp.manager.accesslog.list");
      }else if (SIConfig.SIACTION_CSV.equalsIgnoreCase(actionName)){//CSV出力
        UIAccesslogListCond ListCond =(UIAccesslogListCond)session.getAttribute(SIConfig.SISESSION_MAN_ACCESSLOG_LIST_NAME);
        if (ListCond==null)ListCond=new UIAccesslogListCond();
        try{
          this.produceCSVFile(request,response,ListCond,databaseConnection.getConnection());
          if (!response.isCommitted()){
            request.setAttribute(SIConfig.SIMESSAGE_ATTRIBUTE_RESULT_NAME,SIErrorFactory.getErrorMsg("database.query.notexist","CSVデータ"));
            forwardKey(request,response,"webshop.jsp.manager.accesslog.list");
          }
        }catch(SIDBAccessException 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.accesslog.list");
        }
      }else if (SIConfig.SIACTION_REFRESH.equalsIgnoreCase(actionName)){//リフレッシュ
        UIAccesslogListCond listCond =(UIAccesslogListCond)session.getAttribute(SIConfig.SISESSION_MAN_ACCESSLOG_LIST_NAME);
        if (listCond==null)listCond=new UIAccesslogListCond();
		listCond.initRefresh(request,urlParam);//7.1.1 ST0236 修正
        session.setAttribute(SIConfig.SISESSION_MAN_ACCESSLOG_LIST_NAME,listCond);
        forwardKey(request,response,"webshop.jsp.manager.accesslog.list");
      //7.1.1 ST0237 修正 ここから
      }else{//一覧と検索などの画面のレコードの表示
        forwardKey(request,response,"webshop.jsp.manager.accesslog.list");
      }
      //7.1.1 ST0237 修正 ここまで
    }catch (SQLException e){
      e.printStackTrace();
      throw new ServletException();
    }catch (NamingException e){
      e.printStackTrace();
      throw new ServletException();
    }finally{
      databaseConnection.close();
    }
  }

  /**
   * <b>produceCSVFile</b>
   * CSVファイルを作成します。
   * @param response クライアントまでのresponse
   * @param lConnection DBへのコネクション
   * @param lListCond CSVファイルに出力するデータセット
   * @return なし
   * @throws なし
   */
  private void produceCSVFile(HttpServletRequest request,HttpServletResponse response,UIAccesslogListCond laccessList,Connection connection)
  throws SIDBAccessException{
    //CSVファイル名の作成
	
    //7.2.0 ST0546 修正・追加 ここから
    int csv=0;
    //月別
    if(laccessList.getDispFlgRdo().equals("2")){
      csv = SICSVConf.SICSV_ACCESS_MONTH_TITLE_INX;
    //曜日別	
    }else if(laccessList.getDispFlgRdo().equals("3")){
      csv = SICSVConf.SICSV_ACCESS_DAYOFWEEK_TITLE_INX;
    //日別
    }else if(laccessList.getDispFlgRdo().equals("0")){
      csv = SICSVConf.SICSV_ACCESS_DATE_INX;	
    //時間帯別
    }else if(laccessList.getDispFlgRdo().equals("1")){
      csv = SICSVConf.SICSV_ACCESS_TIME_INX;
    }		
    //7.2.0 ST0546 修正・追加 ここまで

    String lCsvFileName=SICSVConf.getCsvFileName(csv);
    SICSVWrite lCsv=new SICSVWrite(lCsvFileName);
	
    if(!laccessList.getDispFlgRdo().equals("1")){//7.2.0 ST0546 追加
      lCsv.setCsvTitleAndField(SICSVConf.getTitleAndFieldName(csv));//タイトルの設定
    //7.2.0 ST0546 追加 ここから
    //時間帯別のときのみ、タイトルを動的に生成
    }else{
      SimpleDateFormat sdf = new SimpleDateFormat(SIConfig.SIDATE_FORMAT);
      SIDateTime day = new SIDateTime();
      try{
        day = new SIDateTime(sdf.parse(laccessList.getDateFrom()));
      }catch(Exception ex){
        day = new SIDateTime();
      }
      
      //タイトルを生成
      String[][] csvTitle = new String[2][9];
      csvTitle[0][0] = "時間帯";
      csvTitle[1][0] = "time";
      for(int i=1;i<8;i++){
        csvTitle[0][i] = day.getFullDate();
        csvTitle[1][i] = "day"+i;
        day.addDay(1);
      }
      csvTitle[0][8] = "アクセス数";
      csvTitle[1][8] = "count";	  
      lCsv.setCsvTitleAndField(csvTitle);
    }
    //7.2.0 ST0546 追加 ここまで

    if (SIDBMultiConf.SIDB_CURRENT_INX ==SIDBMultiConf.SIDB_POSTGRESQL_INX){
    }else{
      lCsv.setFieldType(SICSVConf.getFieldType(csv));
    }
    lCsv.setFileName(SICSVConf.getCsvFileName(csv));//ファイル名の設定

    //データレコードの作製
    Collection csvData = laccessList.getCollection(connection);
    Collection csvBody = new ArrayList();
    int lColumnCount=0;
    String[] lLineData=null;
    Iterator iterator = csvData.iterator();
    while(iterator.hasNext()){
      //一行のデータの生成
      lLineData=new String[9];  //7.2.0 ST0546 修正
      SIAccesslog csvline = (SIAccesslog)iterator.next();
      String str = "";
	  
      //7.2.0 ST0546 修正・追加 ここから
      //月別
      if(laccessList.getDispFlgRdo().equals("2")){
        if(csvline.getMonth().equals("01"))lLineData[0] = csvline.getYear();
        lLineData[1] = csvline.getMonth();
        lLineData[2] = csvline.getCount();
      //曜日別	
      }else if(laccessList.getDispFlgRdo().equals("3")){
        lLineData[0] = csvline.getDate();
        for(int i=0;i<8;i++){
          lLineData[i+1] = csvline.getWeekCount(i);
        }
      //日別
      }else if(laccessList.getDispFlgRdo().equals("0")){
        lLineData[0] = csvline.getDate();
        lLineData[1] = csvline.getCount();
      //時間帯別
      }else if(laccessList.getDispFlgRdo().equals("1")){
        lLineData[0] = csvline.getTime();
        for(int i=0;i<8;i++){
          lLineData[i+1] = csvline.getWeekCount(i);
        }
      }
      //7.2.0 ST0546 修正・追加 ここまで

      //ファイルに一レコードのデータを書き込む
      csvBody.add(lLineData);
    }

    //CSVファイルの出力
    lCsv.executeCollection(csvBody,response);
  }
}