/*
 * 作成日: 2005/02/19
 *
 * TODO この生成されたファイルのテンプレートを変更するには次へジャンプ:
 * ウィンドウ - 設定 - Java - コード・スタイル - コード・テンプレート
 */
package jp.co.ntt.lms.xmf.lo.wbt.IndividualLog;

import jp.co.ntt.lms.xmf.lo.wbt.IndividualLog.function.*;
import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import jp.co.ntt.lms.lo.LoTopClient;
import jp.co.ntt.lms.xmf.lo.wbt.IndividualLog.inc.IndividualLogCommon_inc;
import jp.co.ntt.lms.xmo.Environment;
import jp.co.ntt.lms.xmo.GroupAndPeople.GroupAndPeopleClient;
import java.io.*;
import jp.co.ntt.lms.xmo.Environment;
import jp.co.ntt.lms.xmo.Lo.LoClient;
import jp.co.ntt.lms.lo.LoTopClient;
import java.util.*;
import java.text.SimpleDateFormat;
import java.net.URLEncoder;
import java.io.UnsupportedEncodingException;
import jp.co.ntt.lms.xmf.xmo.Com.*;

/**
 * @author Administrator
 *
 * TODO この生成された型コメントのテンプレートを変更するには次へジャンプ:
 * ウィンドウ - 設定 - Java - コード・スタイル - コード・テンプレート
 */
public class CsvOut extends HttpServlet{

	private IndividualLogCommon_inc IndividualLogCommon_inc = new IndividualLogCommon_inc();
	private GetCsvUserList GetCsvUserList = new GetCsvUserList();
	private GetCsvAuidList GetCsvAuidList = new GetCsvAuidList();
	private GetCsvAUsystemID GetCsvAUsystemID = new GetCsvAUsystemID();

	/*
	 * (非 Javadoc)
	 * 
	 * @see javax.servlet.http.HttpServlet#doGet(javax.servlet.http.HttpServletRequest,
	 *      javax.servlet.http.HttpServletResponse)
	 */
	protected void doGet(HttpServletRequest request,
			HttpServletResponse response) throws ServletException, IOException {
		// TODO 自動生成されたメソッド・スタブ
		this.execute(request, response);
	}

	/*
	 * (非 Javadoc)
	 * 
	 * @see javax.servlet.http.HttpServlet#doPost(javax.servlet.http.HttpServletRequest,
	 *      javax.servlet.http.HttpServletResponse)
	 */
	protected void doPost(HttpServletRequest request,
			HttpServletResponse response) throws ServletException, IOException {
		// TODO 自動生成されたメソッド・スタブ
		this.execute(request, response);
	}

	private void execute(HttpServletRequest request, HttpServletResponse response) {
	//-------------------------------------------------------------------------
	//パラメータ取得
	//-------------------------------------------------------------------------
	String strLoID		= request.getParameter("LoID");		// LoID
	String strUserId	= request.getParameter("userId");	// ユーザID
	String strLoType	= request.getParameter("LoType");	// LOタイプ
	String strUID		= request.getParameter("UID");		// UID
	String strCsvId		= request.getParameter("CsvId");	// CsvId

	if ( strLoID == null)
	{
		strLoID = "";
	}
	if ( strUserId == null)
	{
		strUserId = "";
	}
	if ( strLoType == null)
	{
		strLoType = "";
	}
	if ( strUID == null)
	{
		strUID = "";
	}
	if ( strCsvId == null)
	{
		strCsvId = "";
	}

	// RealLoIDを取得しているが不要となるため削除

	//-------------------------------------------------------------------------
	//パラメータ連結(Get送信用)
	//-------------------------------------------------------------------------
	String strPrm = "?LoID=" + strLoID + "&userId=" + strUserId + "&LoType=" + strLoType + "&UID=" + strUID + "&CsvId=" + strCsvId;

	//	LoTopClientの生成
	Environment objEnv;
	try{
		objEnv = new Environment();
	}catch(Exception e){
				e.printStackTrace();
		try {
			response.sendRedirect(ComFunction.getParamErrURL(IndividualLogCommon_inc.MSG_FILE_ACCESS_ERR, null, true));
		} catch (UnsupportedEncodingException e1) {
			// TODO 自動生成された catch ブロック
			e1.printStackTrace();
		} catch (IOException e1) {
			// TODO 自動生成された catch ブロック
			e1.printStackTrace();
		}
		return;
	}
	String strServerName;
	try{
		strServerName = objEnv.getLoServerName();
	}catch(Exception e){
				e.printStackTrace();
		try {
			response.sendRedirect(ComFunction.getParamErrURL(IndividualLogCommon_inc.MSG_ENV_ERR, null, true));
		} catch (UnsupportedEncodingException e1) {
			// TODO 自動生成された catch ブロック
			e1.printStackTrace();
		} catch (IOException e1) {
			// TODO 自動生成された catch ブロック
			e1.printStackTrace();
		}
		return;
	}
	LoTopClient objLoTop;
	try {
		objLoTop = new LoTopClient(strServerName, "1");
	} catch (Exception e1) {
		// TODO 自動生成された catch ブロック
		e1.printStackTrace();
		return;
	}
	//クエリーIDの選択
	String strQueryID;
	if ( strCsvId.equals("1") || strCsvId.equals("2") ){
		strQueryID = IndividualLogCommon_inc.LOG2001;
	}
	else {
		strQueryID = IndividualLogCommon_inc.LOG2002;
	}

	//	UIDリストの取得
	Vector vecResult = GetCsvAuidList.getCsvAuidList( strUID, strLoID, request.getSession() );
	String[] strUIDList = new String[vecResult.size()];
	vecResult.copyInto(strUIDList);

	try {
		//	ユーザIDリストの取得
		vecResult = GetCsvUserList.getCsvUserList( strCsvId , strUserId );
	} catch (Exception e2) {
		// TODO 自動生成された catch ブロック
		e2.printStackTrace();
	}
	if ( vecResult.size() == 0 ) {
		try {
			alertEnd( IndividualLogCommon_inc.MSG_USER_NOT_EXISTS, response );
		} catch (IOException e3) {
			// TODO 自動生成された catch ブロック
			e3.printStackTrace();
		} catch (Exception e3) {
			// TODO 自動生成された catch ブロック
			e3.printStackTrace();
		}
		return;
	}
	String[] strUserIDList = new String[vecResult.size()];
	vecResult.copyInto(strUserIDList);

	// RealLoIDからの検索からLOIDからの検索に修正
	objLoTop.addLoLogCondition(strLoID);
	if(!objLoTop.getIndividualLogCSV(strQueryID, strUserIDList, strUIDList)){
		String errorMsg = objLoTop.getMessageData().getMessage();
		try {
			response.sendRedirect(ComFunction.getParamErrURL(errorMsg, null, true));
		} catch (UnsupportedEncodingException e3) {
			// TODO 自動生成された catch ブロック
			e3.printStackTrace();
		} catch (IOException e3) {
			// TODO 自動生成された catch ブロック
			e3.printStackTrace();
		}
		return;
	}
	String[][] logResult = objLoTop.getIndividualLogCSVResult();
	if ( logResult.length == 0 ) {
		try {
			alertEnd( IndividualLogCommon_inc.MSG_LOG_NOT_FOUND, response );
		} catch (IOException e3) {
			// TODO 自動生成された catch ブロック
			e3.printStackTrace();
		} catch (Exception e3) {
			// TODO 自動生成された catch ブロック
			e3.printStackTrace();
		}
		return;
	}
	String strAUsystemID = null;
	StringBuffer strBufOutData = new StringBuffer();
	if ( strQueryID.equals( IndividualLogCommon_inc.LOG2001 ) ){
		//	AiccCore
		// タイトル行
		strBufOutData.append("\"").append(IndividualLogCommon_inc.STR_CSV_USERID_o).append("\"");
		strBufOutData.append(",\"").append(IndividualLogCommon_inc.STR_CSV_USER_FORIGNID_o).append("\"");
		strBufOutData.append(",\"").append(IndividualLogCommon_inc.STR_CSV_LO_COUESEID_o).append("\"");
		strBufOutData.append(",\"").append(IndividualLogCommon_inc.STR_CSV_LO_FORIGNID_o).append("\"");
		strBufOutData.append(",\"").append(IndividualLogCommon_inc.STR_CSV_START_DATE_o).append("\"");
		strBufOutData.append(",\"").append(IndividualLogCommon_inc.STR_CSV_START_TIME_o).append("\"");
		strBufOutData.append(",\"").append(IndividualLogCommon_inc.STR_CSV_AUSYSTEMID_o).append("\"");
		strBufOutData.append(",\"").append(IndividualLogCommon_inc.STR_CSV_LESSON_STATUS_o).append("\"");
		strBufOutData.append(",\"").append(IndividualLogCommon_inc.STR_CSV_LESSON_LOCATION_o).append("\"");
		strBufOutData.append(",\"").append(IndividualLogCommon_inc.STR_CSV_RAWSCORE_o).append("\"");
		strBufOutData.append(",\"").append(IndividualLogCommon_inc.STR_CSV_MAXSCORE_o).append("\"");
		strBufOutData.append(",\"").append(IndividualLogCommon_inc.STR_CSV_MINSCORE_o).append("\"");
		strBufOutData.append(",\"").append(IndividualLogCommon_inc.STR_CSV_STUDYTIME_o).append("\"");
		strBufOutData.append(",\"").append(IndividualLogCommon_inc.STR_CSV_EXIST_o).append("\"");
		strBufOutData.append("\n");
		// データ行
		for(int i=0; i<logResult.length; i++){
			strAUsystemID = GetCsvAUsystemID.getCsvAUsystemID( logResult[i][6], strLoID, request.getSession() );
			strBufOutData.append("\"").append(logResult[i][0]).append("\"");
			strBufOutData.append(",\"").append(logResult[i][1]).append("\"");
			strBufOutData.append(",\"").append(logResult[i][2]).append("\"");
			strBufOutData.append(",\"").append(logResult[i][3]).append("\"");
			strBufOutData.append(",\"").append(logResult[i][4]).append("\"");
			strBufOutData.append(",\"").append(logResult[i][5]).append("\"");
			strBufOutData.append(",\"").append(strAUsystemID).append("\"");
			strBufOutData.append(",\"").append(logResult[i][7]).append("\"");
			strBufOutData.append(",\"").append(logResult[i][8]).append("\"");
			strBufOutData.append(",").append(logResult[i][9]);
			strBufOutData.append(",").append(logResult[i][10]);
			strBufOutData.append(",").append(logResult[i][11]);
			strBufOutData.append(",\"").append(logResult[i][12]).append("\"");
			strBufOutData.append(",\"").append(logResult[i][13]).append("\"");
			strBufOutData.append("\n");
		}
	}
	else {
		//	AiccInteraction
		// タイトル行
		strBufOutData.append("\"").append(IndividualLogCommon_inc.STR_CSV_USER_FORIGNID_o).append("\"");
		strBufOutData.append(",\"").append(IndividualLogCommon_inc.STR_CSV_LO_FORIGNID_o).append("\"");
		strBufOutData.append(",\"").append(IndividualLogCommon_inc.STR_CSV_START_DATE_o).append("\"");
		strBufOutData.append(",\"").append(IndividualLogCommon_inc.STR_CSV_START_TIME_o).append("\"");
		strBufOutData.append(",\"").append(IndividualLogCommon_inc.STR_CSV_COUESE_ID_o).append("\"");
		strBufOutData.append(",\"").append(IndividualLogCommon_inc.STR_CSV_STUDENT_ID_o).append("\"");
		strBufOutData.append(",\"").append(IndividualLogCommon_inc.STR_CSV_LESSON_ID_o).append("\"");
		strBufOutData.append(",\"").append(IndividualLogCommon_inc.STR_CSV_DATE_o).append("\"");
		strBufOutData.append(",\"").append(IndividualLogCommon_inc.STR_CSV_TIME_o).append("\"");
		strBufOutData.append(",\"").append(IndividualLogCommon_inc.STR_CSV_INTERACTIONID_o).append("\"");
		strBufOutData.append(",\"").append(IndividualLogCommon_inc.STR_CSV_OBJECTIVEID_o).append("\"");
		strBufOutData.append(",\"").append(IndividualLogCommon_inc.STR_CSV_TYPE_INTERACTION_o).append("\"");
		strBufOutData.append(",\"").append(IndividualLogCommon_inc.STR_CSV_CORRECT_RESPONSE_o).append("\"");
		strBufOutData.append(",\"").append(IndividualLogCommon_inc.STR_CSV_RESPONSE_VALUE_o).append("\"");
		strBufOutData.append(",\"").append(IndividualLogCommon_inc.STR_CSV_STUDENT_RESPONSE_o).append("\"");
		strBufOutData.append(",\"").append(IndividualLogCommon_inc.STR_CSV_RESULT_o).append("\"");
		strBufOutData.append(",\"").append(IndividualLogCommon_inc.STR_CSV_WEITING_o).append("\"");
		strBufOutData.append(",\"").append(IndividualLogCommon_inc.STR_CSV_LATENCY_o).append("\"");
		strBufOutData.append("\n");
		// データ行
		for(int i=0; i<logResult.length; i++){
			strAUsystemID = GetCsvAUsystemID.getCsvAUsystemID( logResult[i][6], strLoID, request.getSession() );
			strBufOutData.append("\"").append(logResult[i][0]).append("\"");
			strBufOutData.append(",\"").append(logResult[i][1]).append("\"");
			strBufOutData.append(",\"").append(logResult[i][2]).append("\"");
			strBufOutData.append(",\"").append(logResult[i][3]).append("\"");
			strBufOutData.append(",\"").append(logResult[i][4]).append("\"");
			strBufOutData.append(",\"").append(logResult[i][5]).append("\"");
			strBufOutData.append(",\"").append(strAUsystemID).append("\"");
			strBufOutData.append(",\"").append(logResult[i][7]).append("\"");
			strBufOutData.append(",\"").append(logResult[i][8]).append("\"");
			strBufOutData.append(",\"").append(logResult[i][9]).append("\"");
			strBufOutData.append(",\"").append(logResult[i][10]).append("\"");
			strBufOutData.append(",\"").append(logResult[i][11]).append("\"");
			strBufOutData.append(",\"").append(logResult[i][12]).append("\"");
			strBufOutData.append(",\"").append(logResult[i][13]).append("\"");
			strBufOutData.append(",\"").append(logResult[i][14]).append("\"");
			strBufOutData.append(",\"").append(logResult[i][15]).append("\"");
			strBufOutData.append(",").append(logResult[i][16]);
			strBufOutData.append(",\"").append(logResult[i][17]).append("\"");
			strBufOutData.append("\n");
		}
	}

	PrintWriter printWriter = null;
	BufferedOutputStream bos = null;
	OutputStreamWriter osw = null;

	try {
		// CSVデータ取得
		String strOutData = strBufOutData.toString();
		// 初期化
		String lsCsvEncode = objEnv.getCsvEncode();
		bos = new BufferedOutputStream(response.getOutputStream());
		osw = new OutputStreamWriter(bos,lsCsvEncode);
		printWriter = new PrintWriter(osw);
		// ログインID取得
		String strLoginID = (String)request.getSession().getAttribute("loginId");	// ログインID
		
		strLoginID = URLEncoder.encode(strLoginID, "UTF-8");				// 日本語対応

		if(strLoginID == null){
			strLoginID = "";
		}
		// 出力処理
		String filename = makeFileName(strLoginID);
		response.setContentType("text/csv; charset=Shift-JIS");
		response.setHeader("Content-Disposition","attachment; filename=" + filename);
		printWriter.print(strOutData);
		printWriter.flush();

	} catch (Exception ex) {
		//例外処理
		ex.printStackTrace();
		return;
	}finally{
		if(printWriter != null){
			printWriter.close();
		}
	}
}
	/**
	 * パラメータのメッセージをalert出力し処理を終了します。
	 */
	private void alertEnd ( String strMsg , HttpServletResponse response )
	throws Exception {
		response.setContentType("text/html; charset=Windows-31J");
		PrintWriter jwOut = response.getWriter(); 
	
		jwOut.write( "<script language=JavaScript>" );
		jwOut.write( "alert(\"" + strMsg + "\");" );
		jwOut.write( "</script>" );

		return;
	}

	/**
	 * CSVファイルのパスを作成します。
	 * @param strFileData CSV形式に編集されたデータ
	 * @return boolean CSVファイル作成の結果を返します。
	 * @exception IOException CSVファイル作成に失敗した場合
	 */
	private String makeFileName( String strLoginID ) {

		StringBuffer sbFileName = null;

		sbFileName = new StringBuffer();

		//日付作成
		Date currentDate = new Date();
		SimpleDateFormat formatter = new SimpleDateFormat ("yyyyMMddhhmmss");
		String strDate = formatter.format(currentDate);

		//出力ファイル名を追加します
		sbFileName.append(strLoginID);
		sbFileName.append(strDate);
		sbFileName.append(".csv");

		return(sbFileName.toString());
	}
}
