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

import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import javax.annotation.Resource;

import org.apache.log4j.Logger;
import org.apache.struts.Globals;
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;

import jp.agentec.sinaburocast.action.AbstractAction;
import jp.agentec.sinaburocast.common.SinaburoConstant;
import jp.agentec.sinaburocast.common.annotation.OperationHistoryAno;
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.GiftExchangeInfo;
import jp.agentec.sinaburocast.entity.Message;
import jp.agentec.sinaburocast.form.admin.setting.MessageRegistForm;
import jp.agentec.sinaburocast.service.GiftExchangeInfoService;
import jp.agentec.sinaburocast.service.MessageService;

/**
 * メッセージ処理
 *
 * @author arakawa
 *
 */
public class MessageRegistAction extends AbstractAction {

	private final Logger logger = Logger.getLogger(getClass());
	private  Integer ECOBO = 1;
	private  Integer ICHICO = 2;

	@ActionForm
	public MessageRegistForm messageRegistForm;

	public MessageService messageService;

	public GiftExchangeInfoService giftExchangeInfoService;

	@Resource
	protected Map requestScope;

	/**
	 * 初期表示
	 */
	@Execute(validator = false)
	public String index() {
		messageRegistForm.messageCd = "1";
		messageSearch();
		return "/admin/setting/messageRegist.html";
	}

	/**
	 * 予約語
	 */
	@Execute(validator = false)
	public String mailResevedPopup() {
		messageRegistForm.serverUrl = PropertyUtil.getString("ENQUETE_SERVER_URL");
		return "/admin/setting/popup.html";
	}

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

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

	/**
	 * メッセージ検索
	 */
	@Execute(validator = false)
	public String messageSearch() {

		if (SinaburoConstant.MessageCode.POINT_USE_ECOBO == Integer.parseInt(messageRegistForm.messageCd) ||
			SinaburoConstant.MessageCode.POINT_USE_ICHICO == Integer.parseInt(messageRegistForm.messageCd)){

			GiftExchangeInfo giftExchangeInfo = new GiftExchangeInfo();
			if(SinaburoConstant.MessageCode.POINT_USE_ECOBO == Integer.parseInt(messageRegistForm.messageCd)) {
				giftExchangeInfo = giftExchangeInfoService.findGiftExchangeInfoById(ECOBO);
			}else {
				giftExchangeInfo = giftExchangeInfoService.findGiftExchangeInfoById(ICHICO);
			}

			if (giftExchangeInfo != null){
				messageRegistForm.startDate = SinaburoUtil.convertStringDateToFormat(giftExchangeInfo.startDate, SinaburoConstant.datePikerSign.signSlash);
				messageRegistForm.endDate = SinaburoUtil.convertStringDateToFormat(giftExchangeInfo.endDate,SinaburoConstant.datePikerSign.signSlash);
				messageRegistForm.expiredMessage = giftExchangeInfo.expiredMessage;
				messageRegistForm.linkText = giftExchangeInfo.linkText;
				messageRegistForm.message = giftExchangeInfo.message;
				messageRegistForm.mailBody = giftExchangeInfo.mailBody;
			}else{
				messageRegistForm.expiredMessage = "";
				messageRegistForm.linkText = "";
				messageRegistForm.message = "";
				messageRegistForm.mailBody = "";
			}
			
		} else {

			Message info = messageService.findById(Integer.parseInt(messageRegistForm.messageCd));
			if (info != null){
				messageRegistForm.message = info.message;
			}else{
				messageRegistForm.message = "";
			}
		}

		return "/admin/setting/messageRegist.html";
	}

	/**
	 * メッセージ登録確認
	 */
	@Execute(validator = true, validate="messageRegistConfirmValidate", input="/admin/setting/messageRegist.html")
	public String messageRegistConfirm() {

		TokenProcessor.getInstance().saveToken(request);
		return "/admin/setting/messageRegistConfirm.html";
	}

	/**
	 * メッセージ登録
	 */
	@Execute(validator = true, input="/admin/setting/messageRegistConfirm.html")
	@OperationHistoryAno(operationTypeId=SinaburoConstant.OperationType.UPDATE,target="メッセージマスタ",detail="登録",screenId=SinaburoConstant.screenId.COS0005)
	public String messageRegist() {

    	// トークン確認
   		if (!TokenProcessor.getInstance().isTokenValid(request, true)) {

   			return "/error/doubleAction.html";
    	}

		if (SinaburoConstant.MessageCode.POINT_USE_ECOBO == Integer.parseInt(messageRegistForm.messageCd) ||
			SinaburoConstant.MessageCode.POINT_USE_ICHICO == Integer.parseInt(messageRegistForm.messageCd)){

			GiftExchangeInfo info = new GiftExchangeInfo();
			if(SinaburoConstant.MessageCode.POINT_USE_ECOBO == Integer.parseInt(messageRegistForm.messageCd)) {
				info = giftExchangeInfoService.findGiftExchangeInfoById(ECOBO);
			}else {
				info = giftExchangeInfoService.findGiftExchangeInfoById(ICHICO);
			}

			if (info == null){

				GiftExchangeInfo giftExchangeInfo = new GiftExchangeInfo();

				giftExchangeInfo.startDate = messageRegistForm.startDate.replace("/", "");
				giftExchangeInfo.endDate = messageRegistForm.endDate.replace("/", "");
				giftExchangeInfo.linkText = messageRegistForm.linkText;
				giftExchangeInfo.message = messageRegistForm.message;
				giftExchangeInfo.expiredMessage = messageRegistForm.expiredMessage;
				giftExchangeInfo.mailBody=messageRegistForm.mailBody;

				giftExchangeInfoService.insertGiftExchangeInfo(giftExchangeInfo, getAdmin());

			}else{

				GiftExchangeInfo giftExchangeInfo = info;
				giftExchangeInfo.startDate = messageRegistForm.startDate.replace("/", "");
				giftExchangeInfo.endDate = messageRegistForm.endDate.replace("/", "");
				giftExchangeInfo.linkText = messageRegistForm.linkText;
				giftExchangeInfo.message = messageRegistForm.message;
				giftExchangeInfo.expiredMessage = messageRegistForm.expiredMessage;
				giftExchangeInfo.updateDate = SinaburoUtil.getTimestamp();
				giftExchangeInfo.upId = getAdmin().loginId;
				giftExchangeInfo.mailBody=messageRegistForm.mailBody;
				giftExchangeInfoService.update(giftExchangeInfo);
			}

		} else {

			Message info = messageService.findById(Integer.parseInt(messageRegistForm.messageCd));
			if (info == null){

				Message message = new Message();
				message.messageCd = Integer.parseInt(messageRegistForm.messageCd);
				message.message = messageRegistForm.message;
		   		messageService.insertMessage(message,getAdmin());
			}else{

				Message message = info;
		   		message.message = messageRegistForm.message;
		   		message.updateDate = SinaburoUtil.getTimestamp();
		   		message.upId = getAdmin().loginId;
		   		messageService.update(message);
			}
		}

		return "/admin/setting/messageRegistEnd.html";
	}


	/**
	 *
	 * @return エラーメッセージを変換する。
	 */
	public ActionMessages messageRegistConfirmValidate(){

   		if (SinaburoConstant.MessageCode.PASS_WORD_CONFIRM == Integer.parseInt(messageRegistForm.messageCd)){

   			Pattern pattern = Pattern.compile("\\{(.*)\\}",Pattern.MULTILINE);
   			Matcher matcher = pattern.matcher(messageRegistForm.message);

   			while (matcher.find()) {

   				if (!"0".equals(matcher.group(1).trim())){

   					addErrorMessage("message", "errors.invalid",SinaburoViewUtil.getMessage("labels.message"));
   					break;
   				}
   			}
   		}

		if (StringUtil.isBlank(messageRegistForm.message)){
			addErrorMessage("message", "errors.required",SinaburoViewUtil.getMessage("labels.message"));
		}

		if (SinaburoConstant.MessageCode.POINT_USE_ECOBO == Integer.parseInt(messageRegistForm.messageCd) ||
			SinaburoConstant.MessageCode.POINT_USE_ICHICO == Integer.parseInt(messageRegistForm.messageCd)){

			if (StringUtil.isBlank(messageRegistForm.startDate)){
				addErrorMessage("dateError", "errors.required",SinaburoViewUtil.getMessage("labels.gift.startDate"));
			}

			if (StringUtil.isBlank(messageRegistForm.endDate)){
				addErrorMessage("dateError", "errors.required",SinaburoViewUtil.getMessage("labels.gift.endDate"));
			}

			if (StringUtil.isBlank(messageRegistForm.linkText)){
				addErrorMessage("linkText", "errors.required",SinaburoViewUtil.getMessage("labels.linkText"));
			}

			if (StringUtil.isBlank(messageRegistForm.expiredMessage)){
				addErrorMessage("expiredMessage", "errors.required",SinaburoViewUtil.getMessage("labels.expiredMessage"));
			}
			
			if (StringUtil.isBlank(messageRegistForm.mailBody)){
				addErrorMessage("mailBody", "errors.required",SinaburoViewUtil.getMessage("labels.expiredMailBody"));
			}
		}

		return (ActionMessages)request.getAttribute(Globals.ERROR_KEY);
	}

}