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

import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Properties;

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.dto.GroupDetailDto;
import jp.agentec.sinaburocast.entity.AdminUser;
import jp.agentec.sinaburocast.entity.DeliveryGroup;
import jp.agentec.sinaburocast.entity.DeliveryGroupMember;
import jp.agentec.sinaburocast.entity.Prefecture;
import jp.agentec.sinaburocast.form.admin.member.DeliveryGroupSearchForm;
import jp.agentec.sinaburocast.service.DeliveryGroupMemberService;
import jp.agentec.sinaburocast.service.DeliveryGroupService;
import jp.agentec.sinaburocast.service.MemberService;
import jp.agentec.sinaburocast.service.PrefectureService;

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.ResponseUtil;

/**
 *
 * 配信グループ検索
 * @author kim-hs
 *
 */
public class DeliveryGroupSearchAction  extends AbstractAction {

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

	@ActionForm
	public DeliveryGroupSearchForm deliveryGroupSearchForm;

	public DeliveryGroupService deliveryGroupService;

	public DeliveryGroupMemberService deliveryGroupMemberService;

	public MemberService memberService;

	public PrefectureService prefectureService;
	/**
	 * 初期表示
	 */
	@Execute(validator = false, reset="clearAll")
	public String index() {
		session.removeAttribute("groupList");
		return "/admin/member/deliveryGroupSearch.html";
	}

	/**
	 * グループ検索
	 * @throws ParseException
	 */
	@Execute(validator = false, reset="clearSearch")
	public String groupSearchResult() throws ParseException {
		//session.setAttribute("groupList", groupList);
		//session.removeAttribute("groupList");
		// トークン発行
		TokenProcessor.getInstance().saveToken(request);

		if(StringUtil.isNotBlank(deliveryGroupSearchForm.fromDay) && !SinaburoUtil.checkDate(deliveryGroupSearchForm.fromDay)){
			addErrorMessage("dateError", "errors.E033");
			addErrorMessage("dateError_1", "errors.E033_1");
			addErrorMessage("dateError_2", "errors.E033_2");
			return "/admin/member/deliveryGroupSearch.html";
		}else if(StringUtil.isNotBlank(deliveryGroupSearchForm.toDay) && !SinaburoUtil.checkDate(deliveryGroupSearchForm.toDay)){
			addErrorMessage("dateError", "errors.E033");
			addErrorMessage("dateError_1", "errors.E033_1");
			addErrorMessage("dateError_2", "errors.E033_2");
			return "/admin/member/deliveryGroupSearch.html";
		}

		if (!StringUtil.isBlank(deliveryGroupSearchForm.fromDay)) {

			if (StringUtil.isBlank(deliveryGroupSearchForm.toDay)) {
				addError(SinaburoViewUtil.getMessage("errors.E018"));
				return "/admin/member/deliveryGroupSearch.html";
			}

		}

		if (!StringUtil.isBlank(deliveryGroupSearchForm.toDay)) {

			if (StringUtil.isBlank(deliveryGroupSearchForm.fromDay)) {
				addError(SinaburoViewUtil.getMessage("errors.E017"));
				return "/admin/member/deliveryGroupSearch.html";
			}
//			addError(SinaburoViewUtil.getMessage("errors.E018"));
//			return "/admin/member/memberReport.html";
		}

		if (!StringUtil.isBlank(deliveryGroupSearchForm.fromDay) && !StringUtil.isBlank(deliveryGroupSearchForm.toDay)) {
//			if (SinaburoUtil.differenceDays(deliveryGroupSearchForm.toDay,deliveryGroupSearchForm.fromDay) > 90) {
//				addError(SinaburoViewUtil.getMessage("errors.E019"));
//				return "/admin/member/deliveryGroupSearch.html";
//			}

			if (SinaburoUtil.differenceDays(deliveryGroupSearchForm.toDay,deliveryGroupSearchForm.fromDay) < 0) {
				addError(SinaburoViewUtil.getMessage("errors.E020"));
				return "/admin/member/deliveryGroupSearch.html";
			}
		}

		List<GroupDetailDto> groupList = new ArrayList<GroupDetailDto>();
//		memberList = memberService.findByMemberList(null, memberSearchForm.pageNo, memberSearchForm,false);
		groupList = deliveryGroupService.findByMemberGroupList(null, deliveryGroupSearchForm.pageNo, deliveryGroupSearchForm, false);

		session.setAttribute("groupList", groupList);



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

	/**
	 * グループ検索ページング
	 * @throws ParseException
	 */
	@Execute(validator = false, urlPattern = "groupSearchResult/{pageNo}", reset="clearPage")
	public String memberSearchResultPage() throws ParseException {

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

		if (!StringUtil.isBlank(deliveryGroupSearchForm.fromDay)) {

			if (StringUtil.isBlank(deliveryGroupSearchForm.toDay)) {
				addError(SinaburoViewUtil.getMessage("errors.E018"));
				return "/admin/member/deliveryGroupSearch.html";
			}

//			addError(SinaburoViewUtil.getMessage("errors.E017"));
//			return "/admin/member/memberReport.html";
		}

		if (!StringUtil.isBlank(deliveryGroupSearchForm.toDay)) {

			if (StringUtil.isBlank(deliveryGroupSearchForm.fromDay)) {
				addError(SinaburoViewUtil.getMessage("errors.E017"));
				return "/admin/member/deliveryGroupSearch.html";
			}
//			addError(SinaburoViewUtil.getMessage("errors.E018"));
//			return "/admin/member/memberReport.html";
		}

		if (!StringUtil.isBlank(deliveryGroupSearchForm.fromDay) && !StringUtil.isBlank(deliveryGroupSearchForm.toDay)) {
			if (SinaburoUtil.differenceDays(deliveryGroupSearchForm.toDay,deliveryGroupSearchForm.fromDay) > 90) {
				addError(SinaburoViewUtil.getMessage("errors.E019"));
				return "/admin/member/deliveryGroupSearch.html";
			}

			if (SinaburoUtil.differenceDays(deliveryGroupSearchForm.toDay,deliveryGroupSearchForm.fromDay) < 0) {
				addError(SinaburoViewUtil.getMessage("errors.E020"));
				return "/admin/member/deliveryGroupSearch.html";
			}
		}

		List<GroupDetailDto> groupList = new ArrayList<GroupDetailDto>();
//		memberList = memberService.findByMemberList(null, memberSearchForm.pageNo, memberSearchForm,false);
		groupList = deliveryGroupService.findByMemberGroupList(null, deliveryGroupSearchForm.pageNo, deliveryGroupSearchForm, false);

		session.setAttribute("groupList", groupList);



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


	/**
	 * 配信グループ編集、再抽出に遷移
	 * @return
	 */
	@Execute(validator = false)
	public String deliveryGroupEdit() {
		// トークン発行
		TokenProcessor.getInstance().saveToken(request);

		//String kk = deliveryGroupSearchForm.groupId;
		DeliveryGroup deliveryGroup = deliveryGroupService.findById(Integer.parseInt(deliveryGroupSearchForm.groupId));
		deliveryGroupSearchForm.editGroupName = deliveryGroup.deliveryGroupName;
		deliveryGroupSearchForm.editMemo = deliveryGroup.memo;

		List<DeliveryGroup> deliveryGroupList = deliveryGroupService.findAllOrderById(Integer.parseInt(deliveryGroupSearchForm.groupId));

		session.setAttribute("deliveryGroupList", deliveryGroupList);

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

	@Execute(validator = false)
	public String deliveryGroupEditError() {
		// トークン発行
		TokenProcessor.getInstance().saveToken(request);

		//String kk = deliveryGroupSearchForm.groupId;
//		DeliveryGroup deliveryGroup = deliveryGroupService.findById(Integer.parseInt(deliveryGroupSearchForm.groupId));
//		deliveryGroupSearchForm.editGroupName = deliveryGroup.deliveryGroupName;
//		deliveryGroupSearchForm.editMemo = deliveryGroup.memo;

//		List<DeliveryGroup> deliveryGroupList = deliveryGroupService.findAllOrderById(Integer.parseInt(deliveryGroupSearchForm.groupId));

//		session.setAttribute("deliveryGroupList", deliveryGroupList);

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

	/**
	 * 配信グループ編集、再抽出
	 * @return
	 */
	@Execute(validator = true,input = "/admin/member/deliveryGroupSearch/deliveryGroupEditError")
	@OperationHistoryAno(operationTypeId=SinaburoConstant.OperationType.DELETE,target="配信グループ編集",detail="更新",screenId=SinaburoConstant.screenId.CDG0002)
	public String deliveryGroupMemberEdit() {

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

   			return "/error/doubleAction.html";
    	}

		AdminUser adminUser = getAdmin();

		DeliveryGroup info =
		deliveryGroupService.findById(Integer.parseInt(deliveryGroupSearchForm.groupId));

		info.deliveryGroupName = deliveryGroupSearchForm.editGroupName;
		info.memo = deliveryGroupSearchForm.editMemo;
		info.updateDate = SinaburoUtil.getTimestamp();
		deliveryGroupService.update(info, adminUser.loginId);

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

	/**
	 * 配信グループ編集、再抽出
	 * @return
	 */
	//@Execute(validator = false)
	@Execute(validator = true,input = "/admin/member/deliveryGroupSearch/deliveryGroupEditError")
	@OperationHistoryAno(operationTypeId=SinaburoConstant.OperationType.DELETE,target="配信グループ再抽出",detail="新規",screenId=SinaburoConstant.screenId.CDG0002)
	public String deliveryGroupRemake() {

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

   			return "/error/doubleAction.html";
    	}

		AdminUser adminUser = getAdmin();

		//配信グループリスト再抽出
		List<DeliveryGroupMember> addList = new ArrayList<DeliveryGroupMember> ();

		List <DeliveryGroupMember> list1 =
		deliveryGroupMemberService.findAllOrderByIdAll(Integer.parseInt(deliveryGroupSearchForm.groupId));

		List <DeliveryGroupMember> list2 =
				deliveryGroupMemberService.findAllOrderByIdAll(Integer.parseInt(deliveryGroupSearchForm.targetList));

		for (DeliveryGroupMember member : list1) {
			//if(!list2.contains(member)){
			if(!contains(list2,member)){
				//if(!addList.contains(member)){
				addList.add(member);
				//}
			}
		}
		if (addList.size() == 0) {
			ActionMessages messages = (ActionMessages)request.getAttribute(Globals.ERROR_KEY);
			if (messages == null) {
				messages = new ActionMessages();
			}

			messages.add("Nomember", new ActionMessage(SinaburoViewUtil.getMessage("errors.E022")));
			request.setAttribute(Globals.ERROR_KEY, messages);

			//addError(SinaburoViewUtil.getMessage("errors.E022"));
			TokenProcessor.getInstance().saveToken(request);
			return "/admin/member/deliveryGroupEdit.html";
		}

		DeliveryGroup deliveryGroup = new DeliveryGroup();
		deliveryGroup.deliveryGroupName = deliveryGroupSearchForm.targetNewName;
		deliveryGroup.delFlg = 0;
		int result = deliveryGroupService.insertDeliveryGroupRe(deliveryGroup,addList,adminUser.loginId);
		if(result < 1){
			addError(SinaburoViewUtil.getMessage("errors.S000"));
			return "/admin/member/deliveryGroupEdit.html";
		}

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


	}
	/**
	 * 配信グループ削除
	 * @return
	 */
	@Execute(validator = false)
	@OperationHistoryAno(operationTypeId=SinaburoConstant.OperationType.DELETE,target="配信グループ削除",detail="削除",screenId=SinaburoConstant.screenId.CDG0001)
	public String deliverygroupDelete() {

    	// トークン確認
//   		if (!TokenProcessor.getInstance().isTokenValid(request, true)) {
//
//   			return "/error/doubleAction.html";
//    	}

		AdminUser adminUser = getAdmin();

		int result = deliveryGroupService.deliteDeliveryGroup(deliveryGroupSearchForm.groupId, adminUser.loginId);
		if(result < 1){
			
			request.setAttribute(SinaburoConstant.notRegistOperationHistoryKey.notRegist, SinaburoConstant.notRegistOperationHistoryKey.notRegist);
			
			addError(SinaburoViewUtil.getMessage("info.I001"));
			return "/admin/member/deliveryGroupSearch.html";
		}

		List<GroupDetailDto> groupList = new ArrayList<GroupDetailDto>();
//		memberList = memberService.findByMemberList(null, memberSearchForm.pageNo, memberSearchForm,false);
		groupList = deliveryGroupService.findByMemberGroupList(null, deliveryGroupSearchForm.pageNo, deliveryGroupSearchForm, false);

		session.setAttribute("groupList", groupList);
		addError(SinaburoViewUtil.getMessage("info.I002"));
		return "/admin/member/deliveryGroupSearch.html";
	}

	/**
	 * 配信グループの会員リストダウンロード
	 * @return
	 * @throws UnsupportedEncodingException
	 * @throws Exception
	 */
	@Execute(validator=false)
	@OperationHistoryAno(operationTypeId=SinaburoConstant.OperationType.DOWNLOAD,target="配信グループ会員リスト",detail="ダウンロード",screenId=SinaburoConstant.screenId.CDG0002)
	public String memberGroupDownload() throws UnsupportedEncodingException, Exception {

		StringBuffer str = new StringBuffer();
		str.append("\"会員ID\"\t\"ログインID\"\t\"パスワード\"\t\"氏\"\t\"名\"\t\"氏(カナ)\"\t\"名(カナ)\"\t\"PCメールアドレス\"\t\"携帯メールアドレス\"\t\"電話\"\t\"性別\"\t\""+
				"生年月日\"\t\"年代\"\t\"郵便番号\"\t\"都道府県\"\t\"市区町村\"\t\"町名・番地\"\t\"建物名\"\t\"ポイント\"\t\"メモ\"\t\"削除フラグ\"\t\"退会有無\"\t\"退会日時\"\t\"退会理由区分\"\t\"退会理由コメント\""
				+"\r\n");
		int offSet=0;
		List<DeliveryGroupMember> list = deliveryGroupMemberService.findAllOrderByIdAllList(Integer.parseInt(deliveryGroupSearchForm.groupId), offSet);

		List<Prefecture> prefectureInfo = prefectureService.findAllOrderById();

		//都道府県
		HashMap<Integer,String> map = new HashMap<Integer,String>();
    	for (Prefecture data : prefectureInfo) {
    		map.put(data.prefectureId,data.prefecture);
    	}
    	//100件ずつ分けて処理する。
    	do{
	    	for (DeliveryGroupMember report : list) {
	    		str.append("\""+report.memberId+"\"\t\""+report.member.loginId+"\"\t\""+report.member.password+"\"\t\""+report.member.firstName+"\"\t\""+report.member.lastName+"\"\t\""+report.member.firstNameKana+"\"\t\""+report.member.lastNameKana);
	    		str.append("\"\t\""+report.member.pcEmail+"\"\t\""+report.member.mbEmail+"\"\t\""+report.member.telno+"\"\t\"");
	    		if (report.member.genderCd != null) {
		    		if (report.member.genderCd == SinaburoConstant.GenderType.MAN) {
		    			str.append("男");
		    		} else if (report.member.genderCd == SinaburoConstant.GenderType.WOMAN) {
						str.append("女");
					} else {
						str.append("");
					}
	    		}
	    		str.append("\"\t\""+report.member.birthday);
	    		String kdk = getOld(report.member.birthday);
	    		str.append("\"\t\""+kdk);
	    		str.append("\"\t\""+report.member.zipCode);
	    		str.append("\"\t\""+map.get(report.member.prefectureId));
	    		str.append("\"\t\""+report.member.cityName+"\"\t\""+report.member.areaName+"\"\t\""+report.member.buildingName);
	    		str.append("\"\t\""+report.member.pointNum);
	    		if (!StringUtil.isBlank(report.member.memo)) {
	    			str.append("\"\t\""+report.member.memo.replace("\\r\\n", ""));
	    		} else {
	    			str.append("\"\t\""+report.member.memo);
	    		}
	    		str.append("\"\t\""+"0");
	    		if(report.memberWithdraw == null) {
	    			str.append("\"\t\"0");
	    			str.append("\"\t\"\"\t\"\"\t\"\"");
	    		} else {
	    			str.append("\"\t\"1");
	    			str.append("\"\t\""+SinaburoUtil.dateToString(report.memberWithdraw.insertDate));
	    			if (!StringUtil.isBlank(report.memberWithdraw.reasonComment)) {
	    				str.append("\"\t\""+getReason_type(report.memberWithdraw.reasonType));
	    			} else {
	    				str.append("\"\t\"");
	    			}
	        		if (!StringUtil.isBlank(report.memberWithdraw.reasonComment)) {
	        			str.append("\"\t\""+report.memberWithdraw.reasonComment.replace("\r\n", "")+"\"");
	        		} else {
	        			str.append("\"\t\""+report.memberWithdraw.reasonComment+"\"");
	        		}
	
	    		}
	    		str.append("\r\n");
	
	    	}
	    	list = deliveryGroupMemberService.findAllOrderByIdAllList(Integer.parseInt(deliveryGroupSearchForm.groupId), offSet+=100);
		}while(!CollectionUtils.isEmpty(list));
    	String contents = str.toString().replace("null", "");

		//20170508 SJIS文字化け対応
		//char[] c = contents.toCharArray();
		//for (int i = 0; i < c.length; i++) {
		//	char d = c[i];
		//	if (d == '\uff0d') c[i] = '\u2212';
		//}
		//contents = new String(c);

		contents = SinaburoUtil.toSJIS(contents);
		ResponseUtil.download(URLEncoder.encode("member_list.tsv", "UTF-8"), contents.getBytes("Windows-31J"));
		//ResponseUtil.download(URLEncoder.encode("member_list.tsv", "UTF-8"), contents.getBytes("Shift_JIS"));
		//response.setContentType("Content-Type content=\"text/html; charset=\"UTF-8\"");
		return null;

	}

	/**
	 *
	 * @param src
	 * @param compare
	 * @return
	 */
	private boolean contains(List<DeliveryGroupMember> src,DeliveryGroupMember compare){
		for (DeliveryGroupMember deliveryGroupMember : src) {
			if (deliveryGroupMember.memberId.equals(compare.memberId))
			    return true;
		}
		return false;
	}

	 /**
	 * 年齢を返す
	 * @param birth_day yyyyMMdd 形式の誕生日
	 * @return 年齢
	 * @throws ParseException
	 */
	public String getOld(String birth_day) throws ParseException {

		if(StringUtil.isBlank(birth_day)) return "";

	    SimpleDateFormat df = new SimpleDateFormat("yyyyMMdd");

	    Calendar cal = Calendar.getInstance();
	    cal.setTime(df.parse(birth_day));

	    Date now = new Date();
	    if (cal.getTime().after(now)) {
	        return ""; // マイナスは0
	    }
	    Calendar nowCal = Calendar.getInstance();
	    nowCal.setTime(now);

	    String nowYmd = df.format(now);
	    String old = ((Long.parseLong(nowYmd) - Long.parseLong(birth_day)) / 100000L) * 10+"";
	    return old;
	}

	/**
	 * 退会理由設定
	 * @param type
	 * @return
	 */
	public String getReason_type(int type) {

		Properties prop = PropertyUtil.getProperties("application_ja",false);
		String withDrawCheckBoxComment0 = prop.get("withDraw.checkBoxComment0").toString();
		String withDrawCheckBoxComment1 = prop.get("withDraw.checkBoxComment1").toString();
		String withDrawCheckBoxComment2 = prop.get("withDraw.checkBoxComment2").toString();
		String result="";

		int test = type;

		ArrayList<String> list = new ArrayList<String>();
		if(test - 4 >= 0){
			list.add(withDrawCheckBoxComment2);
			test -= 4;
		}

		if(test - 2 >= 0){
			list.add(withDrawCheckBoxComment1);
			test -= 2;
		}

		if(test - 1 >= 0){
			list.add(withDrawCheckBoxComment0);
			test -= 1;
		}


		if(!list.isEmpty()){result=list.get(list.size() -1);}

		for(int i=list.size()-2;i >= 0;i--){
			result+=":"+list.get(i);
		}
		return result;
	}

}