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

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

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 jp.agentec.sinaburocast.action.AbstractAction;
import jp.agentec.sinaburocast.common.SinaburoConstant;
import jp.agentec.sinaburocast.common.annotation.OperationHistoryAno;
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.Postalcode;
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.PostalcodeService;
import jp.agentec.sinaburocast.service.PrefectureService;

/**
 *
 * 会員登録
 * @author kim-hs
 *
 */
public class MemberRegistAction extends AbstractAction {

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

	@ActionForm
	public MemberEditForm memberEditForm;

	public PrefectureService prefectureService;

	public MemberService memberService;

	public PostalcodeService postalcodeService;
	/**
	 * 初期表示
	 */
	@Execute(validator = false)
	public String index() {

		//都道府県
		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));

//		memberEditForm.birthdayY = "";
//		memberEditForm.birthdayM = "";
//		memberEditForm.birthdayD = "";
//		memberEditForm.genderCd="";
		memberEditForm.point = "0";

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

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

	/**
	 * 会員登録確認
	 * @return
	 */
	@Execute(validator = true, input="/admin/member/memberInput.html")
	public String memberConfirm() {

		List<Member> memberList = null;
		Member memberInfo = 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/memberInput.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("Email", new ActionMessage(SinaburoViewUtil.getMessage("errors.E071")));
			request.setAttribute(Globals.ERROR_KEY, messages);
			return "/admin/member/memberInput.html";
		}

		//メールアドレス重複チェックメインメール
		if (!memberEditForm.mainPcEmail.trim().equals(memberEditForm.mainPcEmailBefore)) {
			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/memberInput.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/memberInput.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/memberInput.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/memberInput.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/memberInput.html";
			}
		}

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

		session.setAttribute("memberRegistInfo", memberEditForm);

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

	/**
	 * 会員登録
	 * @return
	 */
	@Execute(validator = false)
	@OperationHistoryAno(operationTypeId=SinaburoConstant.OperationType.DELETE,target="会員登録",detail="登録",screenId=SinaburoConstant.screenId.CMM0003)
	public String memberRegist() {
		memberEditForm = (MemberEditForm)session.getAttribute("memberRegistInfo");
    	// トークン確認
   		if (!TokenProcessor.getInstance().isTokenValid(request, true)) {

   			return "/error/doubleAction.html";
    	}

		Member member = new Member();
		AdminUser adminUser = getAdmin();

		member.loginId = memberEditForm.loginId;
		//member.memberId = Integer.parseInt(memberEditForm.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);
		member.authFailNum = 0;
		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;
		}

		int retValue = memberService.insertMemberAdmin(member,  adminUser.loginId);

		if(retValue < 1){
			addError(SinaburoViewUtil.getMessage("errors.S000"));
			return "/admin/member/memberInput.html";
		}
		return "/admin/member/memberInputRegist.html";
	}

	/**
	 * 住所検索
	 *
	 * @return
	 */
	@Execute(validator = false)
	public String addrSearch() {

		String zipCode = memberEditForm.zipCode;

		List<Postalcode> postalcodeList = new ArrayList<Postalcode>();
		if (zipCode.length() < 3) {
			postalcodeList = null;
		} else {
			postalcodeList = postalcodeService.findTestListByName(zipCode);
		}
		session.setAttribute("postalcodeList", postalcodeList);

		return "/user/userEdit/addrSrch.html";
	}
}