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

import java.io.UnsupportedEncodingException;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.List;

import javax.mail.MessagingException;

import org.apache.commons.collections.CollectionUtils;
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;
import org.seasar.struts.util.RequestUtil;

import jp.agentec.sinaburocast.action.AbstractAction;
import jp.agentec.sinaburocast.common.SinaburoConstant;
import jp.agentec.sinaburocast.common.annotation.OperationHistoryAno;
import jp.agentec.sinaburocast.common.exception.SystemException;
import jp.agentec.sinaburocast.common.util.SinaburoUtil;
import jp.agentec.sinaburocast.common.util.SinaburoViewUtil;
import jp.agentec.sinaburocast.entity.AdminUser;
import jp.agentec.sinaburocast.entity.Member;
import jp.agentec.sinaburocast.entity.Prefecture;
import jp.agentec.sinaburocast.form.admin.member.MemberEditForm;
import jp.agentec.sinaburocast.service.MemberService;
import jp.agentec.sinaburocast.service.PrefectureService;

/**
 * @author kim-hs
 * 会員情報編集
 *
 */
public class MemberEditAction extends AbstractAction {

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

	@ActionForm
	public MemberEditForm memberEditForm;

	public MemberService memberService;

	public PrefectureService prefectureService;

	/**
	 * 初期表示
	 *
	 * 検索結果から編集画面
	 *
	 */
	@Execute(validator = false)
	public String index() {


		Member memberInfo = memberService.findByIdAdmin(Integer.parseInt(memberEditForm.memberId));

		memberEditForm.loginId = memberInfo.loginId;
		memberEditForm.loginIdBefore = memberInfo.loginId;
		memberEditForm.firstName = memberInfo.firstName;
		memberEditForm.lastName = memberInfo.lastName;
		memberEditForm.firstNameKana = memberInfo.firstNameKana;
		memberEditForm.lastNameKana = memberInfo.lastNameKana;
		memberEditForm.mainPcEmail = memberInfo.mainPcEmail;
		memberEditForm.mainPcEmailBefore = memberInfo.mainPcEmail;

		memberEditForm.subPcEmail = memberInfo.subPcEmail;
		memberEditForm.subPcEmailBefore = memberInfo.subPcEmail;

		memberEditForm.password = memberInfo.password;
		memberEditForm.password2 = memberInfo.password;

		memberEditForm.zipCode  = memberInfo.zipCode;
		memberEditForm.prefectureId = String.valueOf(memberInfo.prefectureId);
		memberEditForm.cityName = memberInfo.cityName;
		memberEditForm.areaName = memberInfo.areaName;
		memberEditForm.buildingName = memberInfo.buildingName;
		//
		memberEditForm.genderCd = StringUtil.isNumber(memberInfo.genderCd+"")?memberInfo.genderCd.toString():null;
		memberEditForm.telNo = memberInfo.telno;
		memberEditForm.point = String.valueOf(memberInfo.pointNum);
		memberEditForm.memo = memberInfo.memo;
		memberEditForm.withDrawFlg = String.valueOf(memberInfo.delFlg);
		memberEditForm.withDrawFlgBefore = String.valueOf(memberInfo.delFlg);


		if (!StringUtil.isBlank(memberInfo.birthday)) {
			memberEditForm.birthdayY = memberInfo.birthday.substring(0, 4);
			memberEditForm.birthdayM = Integer.parseInt(memberInfo.birthday.substring(4, 6))+"";
			memberEditForm.birthdayD = Integer.parseInt(memberInfo.birthday.substring(6, 8))+"";
		}

		//都道府県
		List<Prefecture> prefectureList = new ArrayList<Prefecture>();

		prefectureList = prefectureService.findAllOrderById();

		session.setAttribute("prefectureList", prefectureList);

		String yy = SinaburoUtil.getTimeStringAs(SinaburoConstant.Formats.TIMESTAMP_FORMAT_YEAR);

		session.setAttribute("birthYYYY", Integer.parseInt(yy));

    	// トークン発行
		TokenProcessor.getInstance().saveToken(request);

		return "/admin/member/memberEdit.html";
	}


	/**
	 * 前の画面に遷移
	 *
	 * @return
	 */
	@Execute(validator = false)
	public String back() {
		memberEditForm = (MemberEditForm)session.getAttribute("memberEditInfo");
		return "/admin/member/memberEdit.html";
	}

	/**
	 * 編集内容確認
	 * @return
	 */
	@Execute(validator = true, input="/admin/member/memberEdit.html")
	public String confirm() {

		Member memberInfo = null;
		List<Member> memberList = null;

		if (memberEditForm.withDrawFlg != null) {
			memberEditForm.withDrawFlg = "1";
		} else {
			memberEditForm.withDrawFlg = "0";
		}

		// E-mail(メイン)メールアドレス登録チェック
		if(StringUtil.isBlank(memberEditForm.mainPcEmail)) {

			ActionMessages messages = (ActionMessages)request.getAttribute(Globals.ERROR_KEY);

			if (messages == null) {
				messages = new ActionMessages();
			}
			messages.add("mainPcEmail", new ActionMessage(SinaburoViewUtil.getMessage("errors.E010")));
			request.setAttribute(Globals.ERROR_KEY, messages);

			return "/admin/member/memberEdit.html";
		}
		// E-mail(サブ)メールチェック
		if (StringUtil.isNotBlank(memberEditForm.subPcEmail) && memberEditForm.mainPcEmail.equals(memberEditForm.subPcEmail)) {
			ActionMessages messages = (ActionMessages)request.getAttribute(Globals.ERROR_KEY);

			if (messages == null) {
				messages = new ActionMessages();
			}
			messages.add("dupEmail", new ActionMessage(SinaburoViewUtil.getMessage("errors.E071")));
			request.setAttribute(Globals.ERROR_KEY, messages);

			return "/user/userEdit/uEdit.html";
		}
		
		//携帯メールチェック
//		if (!StringUtil.isBlank(memberEditForm.subPcEmail)) {
//			if (!SinaburoUtil.mobileAddressCheck(memberEditForm.subPcEmail)) {
//				ActionMessages messages = (ActionMessages)request.getAttribute(Globals.ERROR_KEY);
//				if (messages == null) {
//					messages = new ActionMessages();
//				}
//				messages.add("subPcEmail", new ActionMessage(SinaburoViewUtil.getMessage("errors.email",SinaburoViewUtil.getMessage("labels.mbMail"))));
//				request.setAttribute(Globals.ERROR_KEY, messages);
//				return "/admin/member/memberEdit.html";
//			}
//		}

		//メールアドレス重複チェックメインメール
		if (!memberEditForm.mainPcEmail.trim().equals(memberEditForm.mainPcEmailBefore)) {
			if (!StringUtil.isBlank(memberEditForm.mainPcEmail)) {
				memberList = memberService.findByEmail(memberEditForm.mainPcEmail);
				if (CollectionUtils.isNotEmpty(memberList)) {
					ActionMessages messages = (ActionMessages)request.getAttribute(Globals.ERROR_KEY);
					if (messages == null) {
						messages = new ActionMessages();
					}
					messages.add("mainPcEmail", new ActionMessage(SinaburoViewUtil.getMessage("errors.E014")));
					request.setAttribute(Globals.ERROR_KEY, messages);

					return "/admin/member/memberEdit.html";

				}
			}
		}

		if (memberEditForm.withDrawFlgBefore.equals(SinaburoConstant.MemberDelFlg.DEL) && memberEditForm.withDrawFlg.equals(SinaburoConstant.MemberDelFlg.NOT_DEL)) {

			if (!StringUtil.isBlank(memberEditForm.mainPcEmail)) {
				memberList = memberService.findByEmail(memberEditForm.mainPcEmail);
				if (CollectionUtils.isNotEmpty(memberList)) {
					ActionMessages messages = (ActionMessages)request.getAttribute(Globals.ERROR_KEY);
					if (messages == null) {
						messages = new ActionMessages();
					}
					messages.add("mainPcEmail", new ActionMessage(SinaburoViewUtil.getMessage("errors.E014")+SinaburoViewUtil.getMessage("errors.E049")));
					request.setAttribute(Globals.ERROR_KEY, messages);

					return "/admin/member/memberEdit.html";

				}
			}
		}

			//メールアドレス重複チェックサブメール
		if (!memberEditForm.subPcEmail.trim().equals(memberEditForm.subPcEmailBefore)) {
			if (!StringUtil.isBlank(memberEditForm.subPcEmail)) {

				memberList = memberService.findByEmail(memberEditForm.subPcEmail);
				if (CollectionUtils.isNotEmpty(memberList)) {
					ActionMessages messages = (ActionMessages)request.getAttribute(Globals.ERROR_KEY);
					if (messages == null) {
						messages = new ActionMessages();
					}

					messages.add("subPcEmail", new ActionMessage(SinaburoViewUtil.getMessage("errors.E015")));
					request.setAttribute(Globals.ERROR_KEY, messages);
					return "/admin/member/memberEdit.html";
				}
			}
		}

		if (memberEditForm.withDrawFlgBefore.equals(SinaburoConstant.MemberDelFlg.DEL) && memberEditForm.withDrawFlg.equals(SinaburoConstant.MemberDelFlg.NOT_DEL)) {
			if (!StringUtil.isBlank(memberEditForm.subPcEmail)) {
				memberList = memberService.findByEmail(memberEditForm.subPcEmail.trim());
				if (CollectionUtils.isNotEmpty(memberList)) {
					ActionMessages messages = (ActionMessages)request.getAttribute(Globals.ERROR_KEY);
					if (messages == null) {
						messages = new ActionMessages();
					}
					messages.add("subPcEmail", new ActionMessage(SinaburoViewUtil.getMessage("errors.E015")+SinaburoViewUtil.getMessage("errors.E049")));
					request.setAttribute(Globals.ERROR_KEY, messages);

					return "/admin/member/memberEdit.html";

				}
			}
		}
		//ログインID重複チェック
		if (!memberEditForm.loginId.trim().equals(memberEditForm.loginIdBefore)) {
			memberInfo = memberService.findByUserId(memberEditForm.loginId);

			if (memberInfo != null) {
				ActionMessages messages = (ActionMessages)request.getAttribute(Globals.ERROR_KEY);
				if (messages == null) {
					messages = new ActionMessages();
				}
				messages.add("loginId", new ActionMessage(SinaburoViewUtil.getMessage("errors.E016")));
				request.setAttribute(Globals.ERROR_KEY, messages);
				//memberEditForm.loginId = memberEditForm.loginIdBefore;
				return "/admin/member/memberEdit.html";
			}
		}

		if (memberEditForm.withDrawFlgBefore.equals(SinaburoConstant.MemberDelFlg.DEL) && memberEditForm.withDrawFlg.equals(SinaburoConstant.MemberDelFlg.NOT_DEL)) {
			if (!StringUtil.isBlank(memberEditForm.loginId)) {
				memberInfo = memberService.findByUserId(memberEditForm.loginId);
				boolean err = false;

				if (memberInfo != null) {
					ActionMessages messages = (ActionMessages)request.getAttribute(Globals.ERROR_KEY);
					if (messages == null) {
						messages = new ActionMessages();
					}
					messages.add("loginId", new ActionMessage(SinaburoViewUtil.getMessage("errors.E016")+SinaburoViewUtil.getMessage("errors.E049")));
					request.setAttribute(Globals.ERROR_KEY, messages);
					err = true;
					//return "/admin/member/memberEdit.html";
				}

				if (!StringUtil.isBlank(memberEditForm.mainPcEmail)) {
					memberList = memberService.findByEmail(memberEditForm.mainPcEmail);
					if (CollectionUtils.isNotEmpty(memberList)) {
						ActionMessages messages = (ActionMessages)request.getAttribute(Globals.ERROR_KEY);
						if (messages == null) {
							messages = new ActionMessages();
						}
						messages.add("mainPcEmail", new ActionMessage(SinaburoViewUtil.getMessage("errors.E014")+SinaburoViewUtil.getMessage("errors.E049")));
						request.setAttribute(Globals.ERROR_KEY, messages);
						err = true;
						//return "/admin/member/memberEdit.html";
					}
				}
				if (!StringUtil.isBlank(memberEditForm.subPcEmail)) {
					memberList = memberService.findByEmail(memberEditForm.subPcEmail);
					if (CollectionUtils.isNotEmpty(memberList)) {
						ActionMessages messages = (ActionMessages)request.getAttribute(Globals.ERROR_KEY);
						if (messages == null) {
							messages = new ActionMessages();
						}
						messages.add("subPcEmail", new ActionMessage(SinaburoViewUtil.getMessage("errors.E015")+SinaburoViewUtil.getMessage("errors.E049")));
						request.setAttribute(Globals.ERROR_KEY, messages);
						err = true;
						//return "/admin/member/memberEdit.html";
					}
				}
				if (err) return "/admin/member/memberEdit.html";
			}
		}
		//パスワードチェック
		if (!memberEditForm.password.trim().equals(memberEditForm.password2.trim())) {
			ActionMessages messages = (ActionMessages)request.getAttribute(Globals.ERROR_KEY);
			if (messages == null) {
				messages = new ActionMessages();
			}
			messages.add("password", new ActionMessage(SinaburoViewUtil.getMessage("errors.E011")));
			request.setAttribute(Globals.ERROR_KEY, messages);
			return "/admin/member/memberEdit.html";
		}

		//
		if (memberEditForm.prefectureId != "") {
			Prefecture prefectureInfo = prefectureService.findById(Integer.parseInt(memberEditForm.prefectureId));
			if (prefectureInfo != null) {
				memberEditForm.prefectureName = prefectureInfo.prefecture;
			}
		}

		//誕生日妥当性チェック
		String birthday = memberEditForm.birthdayY + memberEditForm.birthdayM + memberEditForm.birthdayD;

		if (birthday.length() > 0 && birthday.length() < 11) {
			birthday = memberEditForm.birthdayY + SinaburoUtil.LeftPadZero(memberEditForm.birthdayM, 2) + SinaburoUtil.LeftPadZero(memberEditForm.birthdayD, 2);
			SimpleDateFormat format = new SimpleDateFormat("yyyyMMdd");
			format.setLenient(false);
			try {
				format.parse(birthday);
			} catch (ParseException e) {

				ActionMessages messages = (ActionMessages)request.getAttribute(Globals.ERROR_KEY);
				if (messages == null) {
					messages = new ActionMessages();
				}
				messages.add("birthdayY", new ActionMessage(SinaburoViewUtil.getMessage("errors.invalid",SinaburoViewUtil.getMessage("labels.birthDay"))));
				request.setAttribute(Globals.ERROR_KEY, messages);
				return "/admin/member/memberEdit.html";
			}
		}

    	// トークン発行
		TokenProcessor.getInstance().saveToken(request);

		session.setAttribute("memberEditInfo", memberEditForm);
		return "/admin/member/memberConfirm.html";
	}

	/**
	 * 会員登録情報更新
	 *
	 * @return
	 * @throws SystemException
	 * @throws MessagingException
	 * @throws UnsupportedEncodingException
	 */
	@Execute(validator = false)
	@OperationHistoryAno(operationTypeId=SinaburoConstant.OperationType.DELETE,target="会員編集",detail="更新",screenId=SinaburoConstant.screenId.CMM0011)
	public String editRegist() throws SystemException, UnsupportedEncodingException, MessagingException  {

		memberEditForm = (MemberEditForm)session.getAttribute("memberEditInfo");
		// トークン確認
		if (!TokenProcessor.getInstance().isTokenValid(RequestUtil.getRequest(), true)) {
   			return "/error/doubleAction.html";
		}

		//Member member = null;
		AdminUser adminUser = getAdmin();
		Member member = memberService.findByIdAdmin(Integer.parseInt(memberEditForm.memberId));

		member.loginId = memberEditForm.loginId;
		//member.memberId = member.memberId;
		member.firstName = memberEditForm.firstName;
		member.lastName = memberEditForm.lastName;
		member.firstNameKana = memberEditForm.firstNameKana;
		member.lastNameKana = memberEditForm.lastNameKana;
		member.mainPcEmail = memberEditForm.mainPcEmail;
		member.subPcEmail = memberEditForm.subPcEmail;
		member.password = memberEditForm.password;
		member.password = memberEditForm.password2;
		member.zipCode = memberEditForm.zipCode;
		if (memberEditForm.prefectureId != "") {
			member.prefectureId = Integer.parseInt(memberEditForm.prefectureId);
		}
		member.cityName = memberEditForm.cityName;
		member.areaName = memberEditForm.areaName;
		member.buildingName = memberEditForm.buildingName;
//		if (memberEditForm.genderCd != "") {
		if (!StringUtil.isBlank(memberEditForm.genderCd)) {
			member.genderCd = Integer.parseInt(memberEditForm.genderCd);
		}
		member.telno = memberEditForm.telNo;
		//member.version = member.version;
		member.birthday = memberEditForm.birthdayY +
				SinaburoUtil.LeftPadZero(memberEditForm.birthdayM, 2) +
				SinaburoUtil.LeftPadZero(memberEditForm.birthdayD, 2);

		member.memo = memberEditForm.memo;
		member.pointNum = Integer.parseInt(memberEditForm.point);

		if(!StringUtil.isBlank(memberEditForm.zipCode)) {
			if (memberEditForm.zipCode.substring(0, 3).equals("272")) {
				member.localCityFlg = 1;
			} else {
				member.localCityFlg = 0;
			}
		}

		if (memberEditForm.withDrawFlg.equals("1")) {
			member.validFlg = 0;
			member.delFlg = 1;
		} else {
			member.validFlg = 1;
			member.delFlg = 0;
		}

		memberService.updateMember(member, adminUser.loginId);

		return "/admin/member/memberRegist.html";
	}

	/**
	 *	メンバー削除
	 *
	 * @return
	 * @throws MessagingException
	 * @throws UnsupportedEncodingException
	 */
	@Execute(validator = false)
	@OperationHistoryAno(operationTypeId=SinaburoConstant.OperationType.DELETE,target="会員削除",detail="削除",screenId=SinaburoConstant.screenId.CMM0009)
	public String deleteMember() {
		// トークン確認
		if (!TokenProcessor.getInstance().isTokenValid(RequestUtil.getRequest(), true)) {
   			return "/error/doubleAction.html";
		}
		AdminUser adminUser = getAdmin();
		memberService.deleteMember(memberEditForm.memberId, adminUser.loginId);

		return "/admin/member/memberDelete.html";
	}
}