/**
 *
 */
package jp.agentec.sinaburocast.action.admin.mail;

import java.io.UnsupportedEncodingException;
import java.util.List;
import java.util.Map;

import javax.annotation.Resource;
import javax.mail.MessagingException;

import jp.agentec.sinaburocast.action.AbstractAction;
import jp.agentec.sinaburocast.common.SinaburoConstant;
import jp.agentec.sinaburocast.common.SinaburoConstant.MailSendTypeStr;
import jp.agentec.sinaburocast.common.annotation.OperationHistoryAno;
import jp.agentec.sinaburocast.common.util.MailUtil;
import jp.agentec.sinaburocast.common.util.PropertyUtil;
import jp.agentec.sinaburocast.common.util.SinaburoUtil;
import jp.agentec.sinaburocast.common.util.SinaburoViewUtil;
import jp.agentec.sinaburocast.common.util.velocity.VelocityTool;
import jp.agentec.sinaburocast.entity.AdminUser;
import jp.agentec.sinaburocast.entity.DeliveryGroup;
import jp.agentec.sinaburocast.entity.DeliveryGroupMember;
import jp.agentec.sinaburocast.entity.Enquete;
import jp.agentec.sinaburocast.entity.EnqueteMail;
import jp.agentec.sinaburocast.form.admin.mail.MailRegistForm;
import jp.agentec.sinaburocast.service.DeliveryGroupMemberService;
import jp.agentec.sinaburocast.service.DeliveryGroupService;
import jp.agentec.sinaburocast.service.EnqueteMailAddressTmpService;
import jp.agentec.sinaburocast.service.EnqueteMailService;
import jp.agentec.sinaburocast.service.EnqueteService;

import org.apache.commons.validator.GenericValidator;
import org.apache.log4j.Logger;
import org.apache.struts.Globals;
import org.apache.struts.action.ActionMessage;
import org.apache.struts.action.ActionMessages;
import org.apache.struts.util.TokenProcessor;
import org.seasar.framework.util.StringUtil;
import org.seasar.struts.annotation.ActionForm;
import org.seasar.struts.annotation.Execute;

/**
 *
 * アンケートメール新規登録
 * @author kim-hs
 *
 */
public class MailRegistAction extends AbstractAction {

	private final Logger logger = Logger.getLogger(getClass());

	@ActionForm
	public MailRegistForm mailRegistForm;

	public DeliveryGroupService deliveryGroupService;

	public DeliveryGroupMemberService deliveryGroupMemberService;

	public EnqueteMailService enqueteMailService;

	public EnqueteService enqueteService;

	public EnqueteMailAddressTmpService enqueteMailAddressTmpService;

	/**
	 * 初期表示
	 * 配信グループ設定
	 * プロパティーから差出人設定
	 */
	@Execute(validator = false)
	public String index() {
		List<DeliveryGroup> deliveryGroupList = deliveryGroupService.findAllOrderById();

		session.setAttribute("deliveryGroupList", deliveryGroupList);

		mailRegistForm.sender =  PropertyUtil.getProperty("email.sender.address");
		return "/admin/mail/mailInput.html";
	}

	/**
	 * クリップボードを設定する。
	 */
	@Execute(validator = false)
	public String setClipboard(){
		VelocityTool.setClipboardString("%"+mailRegistForm.clipboard+"%");
		return "/admin/mail/popup.html";
	}

	/**
	 * テストメール送信
	 * @throws MessagingException
	 * @throws UnsupportedEncodingException
	 */
	@Execute(validator = true, input="/admin/mail/mailInput.html")
	public String testMailSend() throws UnsupportedEncodingException, MessagingException{

		//メール送信
		try {
			MailUtil.send(mailRegistForm.testMail,mailRegistForm.subject, mailRegistForm.mailBody);
		} catch (MessagingException e) {
			logger.warn("Mail send failed." + e.toString());
			addErrorMessage("testMail", SinaburoViewUtil.getMessage("errors.E055"));
			return "/admin/mail/mailInput.html";
		}

		return "/admin/mail/mailInput.html";
	}

	/**
	 * 一時保存
	 * @throws MessagingException
	 * @throws UnsupportedEncodingException
	 */
	@Execute(validator = false)
	@OperationHistoryAno(operationTypeId=SinaburoConstant.OperationType.INSERT,target="メール一時保存",detail="一時保存",screenId=SinaburoConstant.screenId.CMS0002)
	public String saveMail() throws UnsupportedEncodingException, MessagingException{
		if (mailRegistForm.sendType.equals(MailSendTypeStr.FILE_UPLOAD)) {
			if(mailRegistForm.enqueteId.equals("")){
				ActionMessages messages = (ActionMessages) request.getAttribute(Globals.ERROR_KEY);
				if (messages == null) {
					messages = new ActionMessages();
				}
				messages.add("enqueteId", new ActionMessage(SinaburoViewUtil.getMessage("errors.E064")));
				request.setAttribute(Globals.ERROR_KEY, messages);
				return "/admin/mail/mailInput.html";
			}
			if(!GenericValidator.isInt(mailRegistForm.enqueteId)){
				ActionMessages messages = (ActionMessages) request.getAttribute(Globals.ERROR_KEY);
				if (messages == null) {
					messages = new ActionMessages();
				}messages.add("enqueteId", new ActionMessage(SinaburoViewUtil.getMessage("errors.integer", SinaburoViewUtil.getMessage("labels.enqueteId"))));
				request.setAttribute(Globals.ERROR_KEY, messages);
				return "/admin/mail/mailInput.html";
			}
			Enquete enquete = enqueteService.findById(Integer.parseInt(mailRegistForm.enqueteId));
			if(enquete == null){
				ActionMessages messages = (ActionMessages)request.getAttribute(Globals.ERROR_KEY);
				if (messages == null) {
					messages = new ActionMessages();
				}
				messages.add("enqueteId", new ActionMessage(SinaburoViewUtil.getMessage("errors.E063")));
				request.setAttribute(Globals.ERROR_KEY, messages);
				return "/admin/mail/mailInput.html";
			}
		} else {
			if (mailRegistForm.deliveryGroupId.equals("")) {
				ActionMessages messages = (ActionMessages) request.getAttribute(Globals.ERROR_KEY);
				if (messages == null) {
					messages = new ActionMessages();
				}
				messages.add("deliveryGroupId", new ActionMessage(SinaburoViewUtil.getMessage("errors.E032")));
				request.setAttribute(Globals.ERROR_KEY, messages);
				return "/admin/mail/mailInput.html";
			}
		}

		AdminUser adminUser = getAdmin();

		EnqueteMail enqueteMail = new EnqueteMail();
		enqueteMail.status = Integer.parseInt(mailRegistForm.status);
		enqueteMail.subject = mailRegistForm.subject;
		if (!mailRegistForm.sendType.equals(MailSendTypeStr.FILE_UPLOAD)) {
			enqueteMail.deliveryGroupId = Integer.parseInt(mailRegistForm.deliveryGroupId);
		} else {
			enqueteMail.enqueteId = Integer.parseInt(mailRegistForm.enqueteId);
		}
		enqueteMail.mailBody = mailRegistForm.mailBody;
		enqueteMail.deliveryTargetType =mailRegistForm.deliveryTargetType;
		enqueteMail.deliveryTargetMethod = mailRegistForm.deliveryTargetMethod;

		enqueteMail.deliveryDate =
				SinaburoUtil.convertStringToTimestamp(mailRegistForm.deliveryDate +" "+ mailRegistForm.deliveryHour +":"+mailRegistForm.deliveryMin +":00", "yyyy-MM-dd HH:mm:ss");

		Integer enqueteId = null;

		if (StringUtil.isBlank(mailRegistForm.enqueteMailId)) {
			enqueteId = enqueteMailService.insertEnqueteMail(enqueteMail,adminUser.loginId);
			mailRegistForm.enqueteMailId = String.valueOf(enqueteId);
		} else {
			EnqueteMail info = enqueteMailService.findById(Integer.parseInt(mailRegistForm.enqueteMailId));
			enqueteMail.enqueteMailId = Integer.parseInt(mailRegistForm.enqueteMailId);
			enqueteMail.version = info.version;
			enqueteMail.insertDate = info.insertDate;
			enqueteMail.insId = info.insId;
			enqueteMailService.update(enqueteMail, adminUser.loginId);
			mailRegistForm.enqueteMailId = String.valueOf(info.enqueteMailId);
		}

		return "/admin/mail/mailInput.html";
	}

	/**
	 * メール作成チェック
	 * @throws MessagingException
	 * @throws UnsupportedEncodingException
	 */
	@Execute(validator = true, input="/admin/mail/mailInput.html", validate="validate")
	public String confirm(){

		TokenProcessor.getInstance().saveToken(request);

		if(StringUtil.isNotBlank(mailRegistForm.deliveryDate) && !SinaburoUtil.checkDate(mailRegistForm.deliveryDate)){
			ActionMessages messages = (ActionMessages)request.getAttribute(Globals.ERROR_KEY);
			if (messages == null) {
				messages = new ActionMessages();
			}
			messages.add("deliveryDate", new ActionMessage(SinaburoViewUtil.getMessage("errors.E033")));
			messages.add("deliveryDate_1", new ActionMessage(SinaburoViewUtil.getMessage("errors.E033_1")));
			messages.add("deliveryDate_2", new ActionMessage(SinaburoViewUtil.getMessage("errors.E033_2")));
			request.setAttribute(Globals.ERROR_KEY, messages);

			return "/admin/mail/mailInput.html";
		}

		//時間指定の過去のチェック
		if (mailRegistForm.deliveryTargetMethod.equals("0")) {
			String strTime = mailRegistForm.deliveryDate + SinaburoUtil.LeftPadZero(mailRegistForm.deliveryHour,2)+mailRegistForm.deliveryMin;
			if (SinaburoUtil.strDateCompare(strTime, "yyyy/MM/ddHHmm") != 1) {
				ActionMessages messages = (ActionMessages)request.getAttribute(Globals.ERROR_KEY);
				if (messages == null) {
					messages = new ActionMessages();
				}
				messages.add("deliveryDate", new ActionMessage(SinaburoViewUtil.getMessage("errors.E030")));
				request.setAttribute(Globals.ERROR_KEY, messages);
				return "/admin/mail/mailInput.html";
			}
		}

		if (mailRegistForm.sendType.equals(MailSendTypeStr.FILE_UPLOAD)) {
			Enquete enquete = enqueteService.findById(Integer.parseInt(mailRegistForm.enqueteId));
			if(enquete == null){
				ActionMessages messages = (ActionMessages)request.getAttribute(Globals.ERROR_KEY);
				if (messages == null) {
					messages = new ActionMessages();
				}
				messages.add("enqueteId", new ActionMessage(SinaburoViewUtil.getMessage("errors.E063")));
				request.setAttribute(Globals.ERROR_KEY, messages);
				return "/admin/mail/mailInput.html";
			}
			mailRegistForm.enqueteName = enquete.enqueteName;
			mailRegistForm.groupName = "ファイル";
		} else {
			DeliveryGroup deliveryGroup = deliveryGroupService.findById(Integer.parseInt(mailRegistForm.deliveryGroupId));
			mailRegistForm.groupName = deliveryGroup.deliveryGroupName;
		}

		session.setAttribute("mailRegistForm", mailRegistForm);

		return "/admin/mail/mailConfirm.html";
	}

	@Resource
	protected Map requestScope;

	/**
	 * アンケートメール登録
	 * @throws Exception
	 */
	@Execute(validator = false)
	@OperationHistoryAno(operationTypeId=SinaburoConstant.OperationType.INSERT,target="メール登録",detail="登録",screenId=SinaburoConstant.screenId.CMS0004)
	public String regist() throws Exception{
		mailRegistForm = (MailRegistForm)session.getAttribute("mailRegistForm");
    	// トークン確認
   		if (!TokenProcessor.getInstance().isTokenValid(request, true)) {

   			return "/error/admin/doubleAction.html";
    	}

		AdminUser adminUser = getAdmin();

		EnqueteMail enqueteMail = new EnqueteMail();
		//配信方法が時間指定の場合、
		if (mailRegistForm.deliveryTargetMethod.equals("0")) {
			enqueteMail.status = SinaburoConstant.MailStatusType.UNCOMPLETE;
		} else {
			enqueteMail.status = SinaburoConstant.MailStatusType.COMPLETE;
		}

		enqueteMail.subject = mailRegistForm.subject;
		if (mailRegistForm.sendType.equals(MailSendTypeStr.FILE_UPLOAD)) {
			enqueteMail.enqueteId = Integer.parseInt(mailRegistForm.enqueteId);
		} else {
			enqueteMail.deliveryGroupId = Integer.parseInt(mailRegistForm.deliveryGroupId);
		}
		enqueteMail.mailBody = mailRegistForm.mailBody;
		enqueteMail.deliveryTargetType =mailRegistForm.deliveryTargetType;
		enqueteMail.deliveryTargetMethod = mailRegistForm.deliveryTargetMethod;

		enqueteMail.deliveryDate =
				SinaburoUtil.convertStringToTimestamp(mailRegistForm.deliveryDate +" "+ mailRegistForm.deliveryHour +":"+mailRegistForm.deliveryMin +":00", "yyyy-MM-dd HH:mm:ss");
		//enqueteMail.enqueteMailId = Integer.parseInt(mailRegistForm.enqueteMailId);

		String serverUrl = PropertyUtil.getString("ENQUETE_SERVER_URL");;

		//時間指定の場合
		if (mailRegistForm.deliveryTargetMethod.equals("0") ) {
			Integer enqueteId = null;

			if (StringUtil.isBlank(mailRegistForm.enqueteMailId)) {
				enqueteId = enqueteMailService.insertEnqueteMail(enqueteMail,adminUser.loginId);
			} else {
				EnqueteMail info = enqueteMailService.findById(Integer.parseInt(mailRegistForm.enqueteMailId));
				enqueteId = Integer.parseInt(mailRegistForm.enqueteMailId);
				enqueteMail.enqueteMailId = Integer.parseInt(mailRegistForm.enqueteMailId);
				enqueteMail.version = info.version;
				enqueteMail.insertDate = info.insertDate;
				enqueteMail.insId = info.insId;
				enqueteMailService.update(enqueteMail, adminUser.loginId);
			}

			// ファイルアップロードの場合、メールアドレスを一時的に保存する
			if (mailRegistForm.sendType.equals(MailSendTypeStr.FILE_UPLOAD)) {
				List<DeliveryGroupMember> list = enqueteMailService.fileRead(mailRegistForm.file);
				enqueteMailAddressTmpService.deleteInsert(enqueteId, list, adminUser.loginId);
			}
		} else {
			//即時送信
			if (!StringUtil.isBlank(mailRegistForm.enqueteMailId)) {
				enqueteMail.enqueteMailId = Integer.parseInt(mailRegistForm.enqueteMailId);
			}
			List<DeliveryGroupMember> list;
			if (mailRegistForm.sendType.equals(MailSendTypeStr.FILE_UPLOAD)) {
				list = enqueteMailService.fileRead(mailRegistForm.file);
			} else {
				list = deliveryGroupMemberService.findAllOrderByIdAllList(enqueteMail.deliveryGroupId, null);
			}
			enqueteMailService.insertRegistMailSendLogic(enqueteMail, adminUser.loginId,serverUrl, list);
		}

		return "/admin/mail/mailRegist.html";
	}

	/**
	 * 前の画面に遷移
	 *
	 * @return
	 */
	@Execute(validator = false)
	public String back() {
		mailRegistForm = (MailRegistForm)session.getAttribute("mailRegistForm");
		return "/admin/mail/mailInput.html";
	}

	/**
	 * アンケートメール検索結果のコピー機能
	 * @return
	 */
	@Execute(validator = false)
	public String copyMail() {

		List<DeliveryGroup> deliveryGroupList = deliveryGroupService.findAllOrderById();

		session.setAttribute("deliveryGroupList", deliveryGroupList);

		mailRegistForm.sender =  PropertyUtil.getProperty("email.sender.address");

		EnqueteMail info = enqueteMailService.findById(Integer.parseInt(mailRegistForm.enqueteMailId));

		mailRegistForm.enqueteMailId = null;
		mailRegistForm.status = info.status.toString();
		mailRegistForm.subject = info.subject;
		if(info.enqueteId != null){
			mailRegistForm.enqueteId = info.enqueteId.toString();
			mailRegistForm.sendType = MailSendTypeStr.FILE_UPLOAD;
		} else {
			mailRegistForm.deliveryGroupId = info.deliveryGroupId.toString();
			mailRegistForm.sendType = MailSendTypeStr.GROUP;
		}
		mailRegistForm.mailBody = info.mailBody;
		mailRegistForm.deliveryTargetType = info.deliveryTargetType;
		mailRegistForm.deliveryTargetMethod = info.deliveryTargetMethod;
		if (!StringUtil.isBlank(info.deliveryTargetMethod)) {
			if (info.deliveryTargetMethod.equals("0")) {
				String strdate = info.deliveryDate.toString();
				mailRegistForm.deliveryDate = strdate.substring(0,10).replace("-", "/");
				mailRegistForm.deliveryHour = strdate.substring(11,13);
				mailRegistForm.deliveryMin = strdate.substring(14,16);
			}
		}
		mailRegistForm.enqueteMailId = null;
		return "/admin/mail/mailInput.html";
	}

	/**
	 * 配信済みのアンケートメール観覧
	 */
	@Execute(validator = false)
	public String mailConfirmPopup() {
		DeliveryGroup deliveryGroup = new DeliveryGroup();
		mailRegistForm.sender =  PropertyUtil.getProperty("email.sender.address");

		EnqueteMail info = enqueteMailService.findById(Integer.parseInt(mailRegistForm.enqueteMailId));

		mailRegistForm.enqueteMailId = null;
		mailRegistForm.status = info.status.toString();
		mailRegistForm.subject = info.subject;

		if(info.enqueteId != null){
			mailRegistForm.enqueteId = info.enqueteId.toString();
			Enquete enquete = enqueteService.findById(Integer.parseInt(mailRegistForm.enqueteId));
			mailRegistForm.sendType = MailSendTypeStr.FILE_UPLOAD;
			mailRegistForm.groupName = "ファイル";
			mailRegistForm.enqueteName = enquete.enqueteName;
		} else {
			mailRegistForm.deliveryGroupId = info.deliveryGroupId.toString();
			deliveryGroup = deliveryGroupService.findByIdName(Integer.parseInt(mailRegistForm.deliveryGroupId));
			mailRegistForm.sendType = MailSendTypeStr.GROUP;
			if (deliveryGroup == null) {
				mailRegistForm.groupName=null;
			} else {
				mailRegistForm.groupName = deliveryGroup.deliveryGroupName;
			}
		}
		mailRegistForm.mailBody = info.mailBody;
		mailRegistForm.deliveryTargetType = info.deliveryTargetType;
		mailRegistForm.deliveryTargetMethod = info.deliveryTargetMethod;
		if (!StringUtil.isBlank(info.deliveryTargetMethod)) {
			if (info.deliveryTargetMethod.equals("0")) {
				String strdate = info.deliveryDate.toString();
				mailRegistForm.deliveryDate = strdate.substring(0,10).replace("-", "/");
				mailRegistForm.deliveryHour = strdate.substring(11,13);
				mailRegistForm.deliveryMin = strdate.substring(14,16);
			}
		}
		mailRegistForm.enqueteMailId = null;

		return "/admin/mail/mailConfirmPopup.html";
	}
}