/**
 *
 */
package jp.agentec.sinaburocast.csv;

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

import javax.servlet.http.HttpServletRequest;

import jp.agentec.sinaburocast.common.util.SinaburoUtil;
import jp.agentec.sinaburocast.common.util.SinaburoViewUtil;
import jp.agentec.sinaburocast.entity.Member;
import jp.agentec.sinaburocast.entity.Prefecture;
import jp.agentec.sinaburocast.service.MemberService;
import jp.agentec.sinaburocast.service.PrefectureService;

import org.seasar.framework.util.StringUtil;
import org.seasar.s2csv.csv.annotation.CSVValidator;
import org.seasar.s2csv.csv.annotation.column.CSVColumn;
import org.seasar.s2csv.csv.annotation.column.CSVMask;
import org.seasar.s2csv.csv.annotation.column.CSVMaxLength;
import org.seasar.s2csv.csv.annotation.column.CSVRequired;
import org.seasar.s2csv.csv.annotation.entity.CSVEntity;
import org.seasar.s2csv.csv.annotation.entity.CSVRecordValidator;
import org.seasar.s2csv.csv.exception.runtime.CSVValidationException;
import org.seasar.struts.util.RequestUtil;

/**
 * @author kim-hs
 *
 */
@CSVRecordValidator(msgKey="errors.mailCheck", method="validateRecord",after=true)
@CSVEntity(header=true,demiliter='\t',headerCheck=false,columnCountCheck=false)
public class MemberInfoCsv extends AbstractCsv {

	public PrefectureService prefectureService;
	public MemberService memberService;

	private int checkMemberId;
	private String checkLoginId;
	private String checkPcEmail;
	private String checkMbEmail;
	private int checkDelFlg;
	

	@CSVValidator(msgKey = "errors.memberId2", method = "validateMemberId")
	@CSVColumn(columnIndex = 0, columnName = "会員ID")
	public String memberId;

	@CSVRequired
	@CSVMask(mask = "^[-_\\.0-9a-zA-Z]{6,20}$")
	@CSVValidator(msgKey = "errors.loginId", method = "validateLoginId")
	@CSVColumn(columnIndex = 1, columnName = "ログインID")
	public String loginId;

	@CSVRequired
	@CSVMask(mask = "^[0-9a-zA-Z]{4,20}$")
	@CSVColumn(columnIndex = 2, columnName = "パスワード")
	public String password;

	@CSVMaxLength(maxlength = 30)
	@CSVMask(mask = "^[^0-9]+$")
	@CSVColumn(columnIndex = 3, columnName = "氏")
	public String firstName;

	@CSVMaxLength(maxlength = 30)
	@CSVMask(mask = "^[^0-9]+$")
	@CSVColumn(columnIndex = 4, columnName = "名")
	public String lastName;

	@CSVMaxLength(maxlength = 30)
	@CSVMask(mask = "^[ァ-ヶー]+$")
	@CSVColumn(columnIndex = 5, columnName = "氏(カナ)")
	public String firstNameKana;

	@CSVMaxLength(maxlength = 30)
	@CSVMask(mask = "^[ァ-ヶー]+$")
	@CSVColumn(columnIndex = 6, columnName = "名(カナ)")
	public String lastNameKana;

	@CSVMaxLength(maxlength = 64)
	@CSVMask(mask = "^[!-~]+@[!-~]+$")
	@CSVValidator(msgKey = "errors.pcEmail", method = "validatepcEmail")
	@CSVColumn(columnIndex = 7, columnName = "PCメールアドレス")
	public String pcEmail;

	@CSVMaxLength(maxlength = 64)
	@CSVMask(mask = "^[!-~]+@[!-~]+$")
	@CSVValidator(msgKey = "errors.mbEmail", method = "validatembEmail")
	@CSVColumn(columnIndex = 8, columnName = "携帯メールアドレス")
	public String mbEmail;

	@CSVMask(mask = "^[0-9]{8,20}$")
	@CSVColumn(columnIndex = 9, columnName = "電話番号")
	public String telNo;

	@CSVValidator(msgKey = "errors.prefecture", method = "validateGenderCd")
	@CSVColumn(columnIndex = 10, columnName = "性別")
	public String genderName;

	@CSVValidator(msgKey = "errors.birthday", method = "validatebirthday")
	@CSVColumn(columnIndex = 11, columnName = "生年月日")
	public String birthday;

	@CSVColumn(columnIndex = 12, columnName = "年代")
	public String age;

	@CSVValidator(msgKey = "errors.prefecture", method = "validatezipCode")
	@CSVMask(mask = "^[0-9]{7}$")
	@CSVColumn(columnIndex = 13, columnName = "郵便番号")
	public String zipCode;

	@CSVMaxLength(maxlength = 256)
	@CSVValidator(msgKey = "errors.prefecture", method = "validatePrefectureName")
	@CSVColumn(columnIndex = 14, columnName = "都道府県")
	public String prefectureName;

	@CSVMaxLength(maxlength = 256)
	@CSVColumn(columnIndex = 15, columnName = "市区町村")
	public String cityName;

	@CSVMaxLength(maxlength = 256)
	@CSVColumn(columnIndex = 16, columnName = "町名・番地")
	public String areaName;

	@CSVMaxLength(maxlength = 256)
	@CSVColumn(columnIndex = 17, columnName = "建物名")
	public String buildingName;

	@CSVRequired
	@CSVMask(mask = "^[0-9]+$")
	@CSVColumn(columnIndex = 18, columnName = "有効ポイント数")
	public String pointNum;

	@CSVMaxLength(maxlength = 256)
	@CSVColumn(columnIndex = 19, columnName = "メモ")
	public String memo;

	@CSVRequired
	@CSVColumn(columnIndex = 20, columnName = "削除フラグ")
	@CSVValidator(msgKey = "", method = "validateDeleteFlg")
	public String deleteFlg;

	@CSVRequired
	@CSVColumn(columnIndex = 21, columnName = "退会有無")
	@CSVValidator(msgKey = "errors.prefecture", method = "validateDrawFlg")
	public String drawFlg;

	@CSVColumn(columnIndex = 22, columnName = "結果")
	public String okNg = "OK";

	@CSVColumn(columnIndex = 23, columnName = "理由")
	public String reason = "reason";

	public Integer prefectureId;

	public Integer genderCd;

	public Integer localCityFlg;

//	@CSVValidator(msgKey = "errors.pcEmail1", method = "validatepcEmail1")
//	@CSVColumn(columnIndex = 7, columnName = "PCメールアドレス")
//	public String pcEmailCheck;
//
//	@CSVValidator(msgKey = "errors.mbEmail1", method = "validatembEmail1")
//	@CSVColumn(columnIndex = 8, columnName = "携帯メールアドレス")
//	public String mbEmailCheck;
	/**
	 * エンティティのバリデーションを行います。
	 */
	public boolean validateRecord(String[] args) {

		String pcMail = args[7];
		String mbMail = args[8];

		if (StringUtil.isBlank(pcMail) && StringUtil.isBlank(mbMail)) {
			return false;
		}

		return true;
	}

	/**
	 * {@link #versionNo}フィールドのバリデーションを行います。
	 */
	public boolean validatePrefectureName(String arg) {

		if (StringUtil.isBlank(arg))
			return true;

		HttpServletRequest request = RequestUtil.getRequest();

		@SuppressWarnings("unchecked")
		HashMap<String, Integer> postalMap = (HashMap<String, Integer>) request
				.getAttribute("postal");

		if (postalMap == null) {

			List<Prefecture> prefectureInfo = prefectureService
					.findAllOrderById();
			postalMap = new HashMap<String, Integer>();

			// 都道府県
			for (Prefecture data : prefectureInfo) {
				postalMap.put(data.prefecture, data.prefectureId);
			}
			request.setAttribute("postal", postalMap);
		}
		// キーがない場合はエラー
		if (!postalMap.containsKey(arg)) {

			return false;
		}

		prefectureId = postalMap.get(arg);
		return true;
	}

	public boolean validateGenderCd(String args) {

		if (StringUtil.isBlank(args)) {
			genderCd = null;
			return true;
		}

		if (args.equals("男")) {
			genderCd = 0;
		} else if (args.equals("女")) {
			genderCd = 1;
		} else {
			genderCd = null;
		}

		return true;
	}

	public boolean validatezipCode(String args) {

		if (StringUtil.isBlank(args)) {
			localCityFlg = 0;
			return true;
		}


		if (args.startsWith("272")) {
			localCityFlg = 1;
		} else {
			localCityFlg = 0;
		}
		return true;
	}

	public boolean validatebirthday(String args) {

		if(StringUtil.isBlank(args))
			return true;

		SimpleDateFormat format = new SimpleDateFormat("yyyyMMdd");
		format.setLenient(false);
		try {
			format.parse(args);
		} catch (ParseException e) {
			return false;
		}
		return true;
	}

	public boolean validatepcEmail(String args) {
		// PCメールアドレスの検証は削除フラグの検証で行う
		checkPcEmail = args;
		return true;
	}

	public boolean validatembEmail(String args) {
		// 携帯メールアドレスの検証は削除フラグの検証で行う
		checkMbEmail = args;
		return true;
	}

	public boolean validateMemberId(String args) {
		if (!StringUtil.equals(args, "")) {
			checkMemberId = Integer.parseInt(args);
		}

		return true;
	}

	public boolean validateLoginId(String args) {
		// ログインIDの検証は削除フラグの検証で行う
		checkLoginId = args;
		return true;
	}
	
	public boolean validateDeleteFlg(String args) {
		if (!StringUtil.equals(args, "")) {
			checkDelFlg = Integer.parseInt(args);
		}
		return true;
	}
	
	public boolean validateDrawFlg(String args) {
		if(checkDelFlg == 1 || args.equals("1")){
			return true;
		}

		StringBuffer errorMessage = new StringBuffer();

		Member memberInfo = memberService.findByUserId(checkLoginId);

		if (memberInfo != null) {
			if (!StringUtil.isBlank(checkLoginId)) {
				if(!memberInfo.memberId.equals(checkMemberId)) {
					errorMessage.append(SinaburoViewUtil.getMessage("errors.E016"));
				}
			}
		}
		
		
		// PCメールチェック
		if (!StringUtil.isBlank(checkPcEmail)) {
			memberInfo = memberService.findByPcEmail(checkPcEmail);
			if(memberInfo != null){
				if(!memberInfo.memberId.equals(checkMemberId)) {
					errorMessage.append(SinaburoViewUtil.getMessage("errors.E014"));
				}
			}
			
			if (SinaburoUtil.mobileAddressCheck(checkPcEmail)) {
				errorMessage.append(SinaburoViewUtil.getMessage("errors.email", SinaburoViewUtil.getMessage("labels.pcMail")));
			}

		}
		
		// 携帯メールチェック
		if (!StringUtil.isBlank(checkMbEmail)) {
			memberInfo = memberService.findByMoEmail(checkMbEmail);
			if(memberInfo != null){
				if(!memberInfo.memberId.equals(checkMemberId)) {
					errorMessage.append(SinaburoViewUtil.getMessage("errors.E015"));
				}
			}
			
			if (!SinaburoUtil.mobileAddressCheck(checkMbEmail)) {
				errorMessage.append(SinaburoViewUtil.getMessage("errors.email", SinaburoViewUtil.getMessage("labels.mbMail")));
			}
		}
		
		if(StringUtil.isNotBlank(errorMessage.toString())){
			throw new CSVValidationException("errors.custom", new Object[]{errorMessage});
		}
		
		return true;
	}
}