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

import java.io.UnsupportedEncodingException;
import java.util.ArrayList;
import java.util.List;

import jp.agentec.sinaburocast.action.AbstractAction;
import jp.agentec.sinaburocast.common.SinaburoConstant;
import jp.agentec.sinaburocast.common.annotation.OperationHistoryAno;
import jp.agentec.sinaburocast.common.io.FileUtil;
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.MemberDetailDto;
import jp.agentec.sinaburocast.entity.AdminUser;
import jp.agentec.sinaburocast.entity.DeliveryGroup;
import jp.agentec.sinaburocast.entity.Member;
import jp.agentec.sinaburocast.entity.Prefecture;
import jp.agentec.sinaburocast.form.admin.member.MemberSearchForm;
import jp.agentec.sinaburocast.service.DeliveryGroupService;
import jp.agentec.sinaburocast.service.EnqueteService;
import jp.agentec.sinaburocast.service.MemberService;
import jp.agentec.sinaburocast.service.PrefectureService;

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.beans.util.BeanUtil;
import org.seasar.framework.util.StringUtil;
import org.seasar.struts.annotation.ActionForm;
import org.seasar.struts.annotation.Execute;
import org.seasar.struts.util.RequestUtil;

/**
 *
 * 会員検索
 * @author kim-hs
 *
 */
public class MemberSearchAction extends AbstractAction {

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

	@ActionForm
	public MemberSearchForm memberSearchForm;

	public PrefectureService prefectureService;
	public MemberService memberService;
	public DeliveryGroupService deliveryGroupService;
	public EnqueteService enqueteService;

	/**
	 * 初期表示
	 */
	@Execute(validator = false, reset="clearAll")
	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));

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

	/**
	 * 会員検索
	 */
	@Execute(validator = false)
	public String memberSearch() {

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

	/**
	 * 会員検索
	 */
	@Execute(validator = true,input="/admin/member/memberSearch.html", reset="clearPage")
	public String memberSearchResult() {

		List<MemberDetailDto> memberList = new ArrayList<MemberDetailDto>();

		memberList = memberService.findByMemberList(null, memberSearchForm.pageNo, memberSearchForm,false);

		session.setAttribute("memberList", memberList);

		if (memberList.size() == 0) {
			addError(SinaburoViewUtil.getMessage("info.I001"));
			return "/admin/member/memberSearch.html";
		}
		session.setAttribute("memberSearchInfo", memberSearchForm);
		return "/admin/member/memberList.html";
	}

	/**
	 * 会員検索
	 */
	@Execute(validator = false)
	public String memberSearchResultBack() {
		memberSearchForm = (MemberSearchForm)session.getAttribute("memberSearchInfo");
		List<MemberDetailDto> memberList = new ArrayList<MemberDetailDto>();

		memberList = memberService.findByMemberList(null, memberSearchForm.pageNo, memberSearchForm,false);

		session.setAttribute("memberList", memberList);

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

	/**
	 * 会員検索Paging
	 * @return
	 */
	@Execute(validator = false, urlPattern = "memberSearchResult/{pageNo}", reset="clearPage")
	public String memberSearchResultPage() {



		List<MemberDetailDto> memberList = new ArrayList<MemberDetailDto>();

		memberList = memberService.findByMemberList(null, memberSearchForm.pageNo, memberSearchForm,false);
		session.setAttribute("memberList", memberList);
		session.setAttribute("memberSearchInfo", memberSearchForm);
		return "/admin/member/memberList.html";
	}

	/**
	 * 配信グループ登録確認
	 * @return
	 */
	@Execute(validator = true,input = "/admin/member/memberList.html")
	@OperationHistoryAno(operationTypeId=SinaburoConstant.OperationType.INSERT,target="配信グループ登録",detail="登録",screenId=SinaburoConstant.screenId.CMS0004)
	public String memberGroupConfirm() {

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

		if (StringUtil.isBlank(memberSearchForm.groupName.trim())) {
			ActionMessages messages = (ActionMessages)request.getAttribute(Globals.ERROR_KEY);

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

			return "/admin/member/memberList.html";
		}
//		if (StringUtil.isBlank(memberSearchForm.groupMemo.trim())) {
//			addError(SinaburoViewUtil.getMessage("errors.E024"));
//			return "/admin/member/memberList.html";
//		}

//		AdminUser adminUser = getAdmin();
//
//		DeliveryGroup deliveryGroup = new DeliveryGroup();
//
//		deliveryGroup.deliveryGroupName = memberSearchForm.groupName;
//		deliveryGroup.memo = memberSearchForm.groupMemo;
//		deliveryGroup.delFlg = 0;
//
//		List<MemberDetailDto> list =
//				memberService.findByMemberList(null, memberSearchForm.pageNo, memberSearchForm,true);
//
//		int result = deliveryGroupService.insertDeliveryGroup(deliveryGroup,list,adminUser.loginId);
//
//		if(result < 1){
//			addError(SinaburoViewUtil.getMessage("errors.S000"));
//			return "/admin/member/memberList.html";
//		}

		MemberSearchForm form = new MemberSearchForm();
		BeanUtil.copyProperties(memberSearchForm, form);

		session.setAttribute("memberSearchInfoBak", form);
		return "/admin/member/memberGroupConfirm.html";
	}
	/**
	 * 配信グループ登録
	 * @return
	 */
	@Execute(validator = true,input = "/admin/member/memberList.html", reset="clearPage")
	@OperationHistoryAno(operationTypeId=SinaburoConstant.OperationType.INSERT,target="配信グループ登録",detail="登録",screenId=SinaburoConstant.screenId.CMS0004)
	public String memberGroupRegist() {
		memberSearchForm = (MemberSearchForm)session.getAttribute("memberSearchInfoBak");
		// トークン確認
		if (!TokenProcessor.getInstance().isTokenValid(RequestUtil.getRequest(), true)) {
   			return "/error/doubleAction.html";
		}

//		if (StringUtil.isBlank(memberSearchForm.groupName.trim())) {
//			addError(SinaburoViewUtil.getMessage("errors.E023"));
//			return "/admin/member/memberList.html";
//		}
//		if (StringUtil.isBlank(memberSearchForm.groupMemo.trim())) {
//			addError(SinaburoViewUtil.getMessage("errors.E024"));
//			return "/admin/member/memberList.html";
//		}

		AdminUser adminUser = getAdmin();

		DeliveryGroup deliveryGroup = new DeliveryGroup();

		deliveryGroup.deliveryGroupName = memberSearchForm.groupName;
		deliveryGroup.memo = memberSearchForm.groupMemo;
		deliveryGroup.delFlg = 0;

		List<MemberDetailDto> list =
				memberService.findByMemberList(null, memberSearchForm.pageNo, memberSearchForm,true);

		int result = deliveryGroupService.insertDeliveryGroup(deliveryGroup,list,adminUser.loginId);

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

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

	/**
	 * 前の画面に遷移
	 *
	 * @return
	 */
	@Execute(validator = false)
	public String back() {

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

	/**
	 * 会員リストダウンロード
	 * @return
	 * @throws UnsupportedEncodingException
	 * @throws Exception
	 */
	@Execute(validator = false)
	@OperationHistoryAno(operationTypeId=SinaburoConstant.OperationType.DOWNLOAD,target="会員リスト",detail="ダウンロード",screenId=SinaburoConstant.screenId.CMM0002)
	public String memberDownload() throws UnsupportedEncodingException, Exception {
		List<Member> list = memberService.findByMemberListCvs(memberSearchForm);
		
		int max=list.size();
		int min=0;
		int count=1000;
		//String contents=null;
		String contents = enqueteService.getMemberDownloadContents(list.subList(min, Math.min(max,min+count)),true, true);
		String csvFileName = PropertyUtil.getProperty(SinaburoConstant.filePath.CSV_MAKE_FILE_PATH)+"member_list."+SinaburoConstant.FileType.TSV;
		
		do{
			
			//20170508 SJIS文字化け対応
			contents = SinaburoUtil.toSJIS(contents);
			FileUtil.writeFile(csvFileName,contents,"Windows-31J",min<=0 ?false: true);
			
			//char[] c = contents.toCharArray();
			//for (int i = 0; i < c.length; i++) {
			//char d = c[i];
			//if (d == '\uff0d') c[i] = '\u2212';
			//}
			//FileUtil.writeFile(csvFileName,contents,"Shift_JIS",min<=0 ?false: true);
			if(min>=max){
				break;
			}
			contents = enqueteService.getMemberDownloadContents(list.subList(Math.min(max,min+=count), Math.min(max,min+count)),true, false);
			
		}while(true);
		
	//	ResponseUtil.download(URLEncoder.encode("member_list.tsv", "UTF-8"), contents.getBytes("Shift_JIS"));
		FileUtil.fileDownload(csvFileName, "UTF-8");
		//response.setContentType("Content-Type content=\"text/html; charset=\"UTF-8\"");
		return null;

	}


}