package jp.agentec.sinaburocast.action.admin.enquete;

import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.math.BigDecimal;
import java.net.URLEncoder;
import java.util.HashMap;
import java.util.List;

import javax.servlet.http.HttpServletResponse;

import jp.agentec.sinaburocast.action.AbstractAction;
import jp.agentec.sinaburocast.action.admin.member.MemberSearchAction;
import jp.agentec.sinaburocast.common.SinaburoConstant;
import jp.agentec.sinaburocast.common.util.EncryptUtil;
import jp.agentec.sinaburocast.common.util.PropertyUtil;
import jp.agentec.sinaburocast.common.util.SinaburoUtil;
import jp.agentec.sinaburocast.entity.EnqueteSummary;
import jp.agentec.sinaburocast.entity.Template;
import jp.agentec.sinaburocast.form.admin.enquete.EnqueteResultForm;
import jp.agentec.sinaburocast.helper.KeyHelper;
import jp.agentec.sinaburocast.service.EnqueteService;
import jp.agentec.sinaburocast.service.EnqueteSummaryService;
import jp.agentec.sinaburocast.service.ReplyService;
import jp.agentec.sinaburocast.service.TemplateService;

import org.apache.log4j.Logger;
import org.seasar.framework.beans.util.BeanMap;
import org.seasar.struts.annotation.ActionForm;
import org.seasar.struts.annotation.Execute;

/**
 * アンケート結果
 *
 * @author choi-c
 *
 */
public class EnqueteResultAction extends AbstractAction {
	
	private final Logger logger = Logger.getLogger(getClass());

	@ActionForm
	public EnqueteResultForm enqueteResultForm;
	
	public EnqueteService enqueteService;
	
	public TemplateService templateService;
	
	public EnqueteSummaryService enqueteSummaryService;
	 
	public MemberSearchAction memberSearchAction;
	
	public EnqueteSearchAction enqueteSearchAction;
	
	public KeyHelper keyHelper;
	
	private static final String CSV_MAKE_FILE_PATH = PropertyUtil.getProperty(SinaburoConstant.filePath.CSV_MAKE_FILE_PATH);
	
	/**
	 * 初期表示「アンケート集計結果画面」
	 * @throws Exception 
	 * @throws UnsupportedEncodingException 
	 */
	@Execute(validator = false,reset="resetIndex")
	public String index() throws UnsupportedEncodingException, Exception {
		/**アンケート結果設定*/
		setEnqueteResult();
		
		return "/admin/enquete/enqueteResult.html";
	}
	
	
	/**
	 * アンケート集計結果ファイル一覧画面
	 */
	@Execute(validator = false,reset="pagingReset")
	public String resultFileList() throws IOException{
		enqueteResultForm.enqueteSummaryList = enqueteSummaryService.getEnqueteSummary(enqueteResultForm);

		HashMap<Integer, String> enqueteIds = new HashMap<Integer, String>();
		for(EnqueteSummary enqueteSumary : enqueteResultForm.enqueteSummaryList){
			String encodeId = null;
			try {
				encodeId = URLEncoder.encode(keyHelper.encryptEnqueteId(enqueteSumary.enquete.enqueteId), "utf-8");
				enqueteIds.put(enqueteSumary.enquete.enqueteId, encodeId);
			} catch (Exception e) {
				logger.error("Encrypt failed. enqueteId:" + enqueteSumary.enquete.enqueteId + e.toString());
			}
		}
		session.setAttribute("enqueteIds", enqueteIds);
		//アンケート集計結果ファイル一覧画面
		return "/admin/enquete/enqueteResultFileList.html";
	}
	
	/**
	 * アンケート集計結果ファイル一覧画面ページング
	 */
	@Execute(validator = false,urlPattern="resultFileListPaging/{pageNo}")
	public String resultFileListPaging() throws IOException{
		//アンケート集計結果ファイル一覧画面
		return resultFileList();
	}
	
	

	
	@Execute(validator = false)
	public String resultFileCsvDownLoad() throws Exception {
		Integer eid;

		if(enqueteResultForm.enquete != null){
			eid = enqueteResultForm.enquete.enqueteId;
		} else {
			eid = enqueteResultForm.csvEid;
		}

		EnqueteSummary enqueteSummary = enqueteSummaryService.findByEnqueteId(eid);
		
		if(enqueteSummary == null || !jp.agentec.sinaburocast.common.io.FileUtil.exists(enqueteSummary.outputCsvFilename)){
			addErrorMessage("NOTEXISTS", "errors.E034");
			return this.resultFileListPaging();
		}
		jp.agentec.sinaburocast.common.io.FileUtil.fileDownload(enqueteSummary.outputCsvFilename, "Shift_JIS");
		return null;
	}
	
	
	
	/**
	 * アンケート結果を設定する。
	 */
	private void setEnqueteResult(){
		enqueteResultForm.enquete = enqueteService.findById(Integer.parseInt(enqueteResultForm.eid));
		
		//ステータス取得
		if (enqueteResultForm.enquete.status == SinaburoConstant.EnqueteStatusType.UNENFORCEMENT) {
			enqueteResultForm.enqueteStatus = "未実施";
		}
		if (enqueteResultForm.enquete.status == SinaburoConstant.EnqueteStatusType.ENFORCEMENT) {
			enqueteResultForm.enqueteStatus = "実施中";
		}

		if (enqueteResultForm.enquete.status == SinaburoConstant.EnqueteStatusType.COMPLETE) {
			enqueteResultForm.enqueteStatus = "完了";
		}
		
		//アンケート区分取得
		Template template = templateService.findByenqueteType(enqueteResultForm.enquete.enqueteType);
		enqueteResultForm.templateName = template.templateName;
		
		//回答件数取得
		BigDecimal resultCnt = new BigDecimal(0);
		if(SinaburoUtil.contain(enqueteResultForm.enquete.enqueteType, SinaburoConstant.EnqueteType.PUBLIC_COMMENT,SinaburoConstant.EnqueteType.RECRUITMENT,SinaburoConstant.EnqueteType.WEB_ENQUETE)){
			resultCnt=resultCnt.add(new BigDecimal(replyService.getAnswerCount(enqueteResultForm.enquete.enqueteId)));
		}else{
			
			List<BeanMap> beanList = enqueteService.getEnqueteAnswerAgeBySql(enqueteResultForm.eid);
			
			for (BeanMap beanMap : beanList) {
				BigDecimal temCnt = new BigDecimal(((Long)beanMap.get("cnt")).longValue());
				resultCnt = resultCnt.add(temCnt);
			}
		}

		enqueteResultForm.answerCount = resultCnt.toString();
	}
	public ReplyService replyService;
		
	@Execute(validator = false)
	public String delete() throws IOException{

		EnqueteSummary enqueteSummary = enqueteSummaryService.findById(Integer.parseInt(enqueteResultForm.enqueteSummaryId));
		
		jp.agentec.sinaburocast.common.io.FileUtil.delete(enqueteSummary.outputCsvFilename == null ? "" :enqueteSummary.outputCsvFilename);
		jp.agentec.sinaburocast.common.io.FileUtil.delete(enqueteSummary.outputHtmlFilename== null ? "" :enqueteSummary.outputHtmlFilename);
		jp.agentec.sinaburocast.common.io.FileUtil.delete(enqueteSummary.outputMbHtmlFilename== null ? "":enqueteSummary.outputMbHtmlFilename);
		jp.agentec.sinaburocast.common.io.FileUtil.delete(enqueteSummary.outputSpHtmlFilename== null ? "":enqueteSummary.outputSpHtmlFilename);
		
		enqueteSummaryService.delete(enqueteSummary);
		
		return resultFileList();
	}
	
	@Execute(validator = false,removeActionForm=true)
	public String backToEnqueteSearch() {
		session.removeAttribute("admin_enquete_enqueteResultForm");
		return enqueteSearchAction.back();
	}
	
	
	

}