/**
 *
 */
package jp.agentec.sinaburocast.action.batch;

import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import jp.agentec.sinaburocast.action.AbstractAction;
import jp.agentec.sinaburocast.common.SinaburoConstant;
import jp.agentec.sinaburocast.common.util.PropertyUtil;
import jp.agentec.sinaburocast.common.util.SinaburoUtil;
import jp.agentec.sinaburocast.csv.MemberMigrationInfoCsv;
import jp.agentec.sinaburocast.csv.PointMigrationInfoCsv;
import jp.agentec.sinaburocast.entity.Member;
import jp.agentec.sinaburocast.entity.PointGet;
import jp.agentec.sinaburocast.form.batch.MemberMigrationInfoRegistForm;
import jp.agentec.sinaburocast.service.MemberService;
import jp.agentec.sinaburocast.service.PointGetService;
import jp.agentec.sinaburocast.service.csv.CsvService;

import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.io.IOUtils;
import org.apache.log4j.Logger;
import org.apache.velocity.tools.generic.DateTool;
import org.seasar.framework.beans.util.BeanMap;
import org.seasar.framework.beans.util.Beans;
import org.seasar.framework.util.FileUtil;
import org.seasar.framework.util.StringUtil;
import org.seasar.struts.annotation.ActionForm;
import org.seasar.struts.annotation.Execute;

/**
 * @author choi-c
 *
 * 会員情報一括登録[マイグレーション用]
 *
 */
public class MemberMigrationInfoRegistAction extends AbstractAction {

	private final Logger logger = Logger.getLogger(getClass());
	
	@ActionForm
	public 	MemberMigrationInfoRegistForm memberMigrationInfoRegistForm;
	
	public CsvService csvService;//<MemberMigrationInfoCsv> <PointMigrationInfoCsv>
	
	public MemberService memberService;
/**
	 * 会員一括登録
	 */
	//@Execute(validator = true, input="/admin/member/memberRegistAll/")
	@Execute(validator = false)
	//@OperationHistoryAno(operationTypeId=SinaburoConstant.OperationType.UPLOAD,target="会員一括登録",detail="アップロード",screenId=SinaburoConstant.screenId.CMM0006)
	public String memberUpload() throws Exception {
		if(StringUtil.isBlank(memberMigrationInfoRegistForm.fileFullPath) 
				){
			logger.fatal("ファイルパスを指定してください。");
			return null;
		}
		File file = new File(memberMigrationInfoRegistForm.fileFullPath);
		if(!file.exists()){
			logger.fatal("ファイルパスが不正です。ファイルパス:"+memberMigrationInfoRegistForm.fileFullPath);
			return null;
		} 

		int result = 0;
		String csvData = null;
		InputStream in = null;

		
		
		try {
			in = new FileInputStream(file);
			//バイナリ形式チェック
            byte[] b = new byte[1];
            while (in.read(b, 0, 1) > 0) {
                if (b[0] == 0) {
                	logger.fatal("バイナリ形式のファイルなので処理を完了します。");
        			return null;
                }
            }
		} finally {
			IOUtils.closeQuietly(in);
		}

		try {
			in = new FileInputStream(file);
			//20170508 SJIS文字化け対応
			csvData = IOUtils.toString(in, "Windows-31J");
		} finally {
			IOUtils.closeQuietly(in);
		}

		StringBuffer isOk   = new StringBuffer("OK");
		//List<MemberInfoCsv> memberCsvList = csvService.parseAll(csvData, MemberInfoCsv.class,isOk);
		List<MemberMigrationInfoCsv> memberCsvList = null;

		try {
			memberCsvList = csvService.parseAll(csvData, MemberMigrationInfoCsv.class,isOk);
		} catch (org.seasar.s2csv.csv.exception.CSVFormatException e) {
			logger.fatal(PropertyUtil.getString("ファイルが不正です。"));
			return null;
		}catch(NumberFormatException e){
			logger.fatal("ファイルが不正です。");
			
			return null;
		}

		if (CollectionUtils.isEmpty(memberCsvList)) {
			logger.fatal("登録対象のデータが存在しないので登録できません。");
			return null;
		}
		String insertUser=PropertyUtil.getString("BATCH_UPDATE");
		for (MemberMigrationInfoCsv memberMigrationInfoCsv : memberCsvList) {
			memberMigrationInfoCsv.insertResult="OK";
			if(StringUtil.isBlank(memberMigrationInfoCsv.pointNum))memberMigrationInfoCsv.pointNum="0";
			Member member = Beans.createAndCopy(Member.class, memberMigrationInfoCsv).execute();
			
			
			try {
				memberService.insert(member,insertUser);
			} catch (Exception e) {
				memberMigrationInfoCsv.insertResult="NG";
			}
			
			//result = memberService.insert(null);
		}
		
		/**結果ファイル作成*/
		String dateStr = new DateTool().format("yyyyMMdd_HHmmss",DateTool.getSystemDate());
		//20170508 SJIS文字化け対応
		String outStr = SinaburoUtil.addDoubleStr(csvService.getContents(memberCsvList, MemberMigrationInfoCsv.class).replace("\"", ""));
		outStr = SinaburoUtil.toSJIS(outStr);
		FileUtil.write(memberMigrationInfoRegistForm.fileFullPath+"_"+dateStr, outStr.getBytes("Windows-31J"));
		//FileUtil.write(memberMigrationInfoRegistForm.fileFullPath+"_"+dateStr, SinaburoUtil.addDoubleStr(csvService.getContents(memberCsvList, MemberMigrationInfoCsv.class).replace("\"", "")).getBytes("Shift_JIS"));
		/**一括登録*/
		//result = memberService.memberAllRegist(memberCsvList, getAdmin());
		logger.info("一括更新件数:"+memberCsvList.size());

		return null;

	}
	
	public PointGetService pointGetService;
	
	@Execute(validator = false)
	//@OperationHistoryAno(operationTypeId=SinaburoConstant.OperationType.UPLOAD,target="会員一括登録",detail="アップロード",screenId=SinaburoConstant.screenId.CMM0006)
	public String pointUpload() throws Exception {
		
		if(StringUtil.isBlank(memberMigrationInfoRegistForm.fileFullPath) 
				){
			logger.fatal("ファイルパスを指定してください。");
			return null;
		}
		File file = new File(memberMigrationInfoRegistForm.fileFullPath);
		if(!file.exists()){
			logger.fatal("ファイルパスが不正です。ファイルパス:"+memberMigrationInfoRegistForm.fileFullPath);
			return null;
		} 

		int result = 0;
		String csvData = null;
		InputStream in = null;

		
		
		try {
			in = new FileInputStream(file);
			//バイナリ形式チェック
            byte[] b = new byte[1];
            while (in.read(b, 0, 1) > 0) {
                if (b[0] == 0) {
                	logger.fatal("バイナリ形式のファイルなので処理を完了します。");
        			return null;
                }
            }
		} finally {
			IOUtils.closeQuietly(in);
		}

		try {
			in = new FileInputStream(file);
			//20170508 SJIS文字化け対応
			csvData = IOUtils.toString(in, "Windows-31J");
			//csvData = IOUtils.toString(in, "Shift_JIS");
		} finally {
			IOUtils.closeQuietly(in);
		}

		StringBuffer isOk   = new StringBuffer("OK");
		//List<MemberInfoCsv> memberCsvList = csvService.parseAll(csvData, MemberInfoCsv.class,isOk);
		List<PointMigrationInfoCsv> pointCsvList = null;

		try {
			pointCsvList = csvService.parseAll(csvData, PointMigrationInfoCsv.class,isOk);
		} catch (org.seasar.s2csv.csv.exception.CSVFormatException e) {
			logger.fatal(PropertyUtil.getString("ファイルが不正です。"));
			return null;
		}catch(NumberFormatException e){
			logger.fatal("ファイルが不正です。");
			
			return null;
		}

		if (CollectionUtils.isEmpty(pointCsvList)) {
			logger.fatal("登録対象のデータが存在しないので登録できません。");
			return null;
		}
		
		String insertUser=PropertyUtil.getString("BATCH_UPDATE");
		ArrayList<Integer> memberIdList = new ArrayList<Integer>(); 
		for (PointMigrationInfoCsv pointMigrationInfoCsv : pointCsvList) {
			pointMigrationInfoCsv.pointGetDate=setvalidatePointDate(pointMigrationInfoCsv.pointGetDateInput);
			
			
			PointGet pointGet = Beans.createAndCopy(PointGet.class, pointMigrationInfoCsv).execute();
			if(!memberIdList.contains(pointMigrationInfoCsv.memberId)){
				memberIdList.add(pointGet.memberId);
			}
			
			if(StringUtil.equals(pointMigrationInfoCsv.okNg, "OK")||pointMigrationInfoCsv.okNg == null){
				pointMigrationInfoCsv.insertResult="OK";
			} else{
				pointMigrationInfoCsv.insertResult="NG";//NGの場合登録しない。
				continue;
			}
			
			//マイナスは登録しない
			if(pointGet.pointGetNum<0){
				pointMigrationInfoCsv.insertResult="NG";//NGの場合登録しない。
				continue;
			}
			
			try {
				pointGetService.insertPointGet(pointGet,insertUser);
			} catch (Exception e) {
				pointMigrationInfoCsv.insertResult="NG";
			}
			
			
		}
		
		
		//PointGetが多い場合MEMBERのPOINT_NUMにあわせる。
		for (Integer fmemberId : memberIdList) {
			BeanMap beanMap =pointGetService.getDefaultPoint(fmemberId);
			if(beanMap != null && StringUtil.equals("P", beanMap.get("mp").toString()) ){
				int herasPoint=(int)((Long)beanMap.get("herasupoint")).doubleValue();//&& beanMap.get()  m.MEMBER_ID ,M.POINT_NUM ,P.zan ppoint, (CASE WHEN M.POINT_NUM > P.ZAN THEN 'M' WHEN M.POINT_NUM < P.ZAN THEN 'P' END) MP
				pointGetService.cutDownPointLogicForMaigration( herasPoint, fmemberId,insertUser);
			
			}
		}
		
		//会員テーブルのポイントが大きいリスト出力
		List<BeanMap> memberLargeList = pointGetService.memberPointLarge();
		
		StringBuilder sb = new StringBuilder();
		
		sb.append(SinaburoConstant.newLine.RN);
		sb.append(SinaburoConstant.newLine.RN);
		sb.append(SinaburoConstant.newLine.RN);
		sb.append("・会員テーブルのポイントが大きいリスト。");
		sb.append(SinaburoConstant.newLine.RN);
		sb.append("会員ID\tポイントPOINT_GET\tポイントMember\tPOINT_GET/Member");
		sb.append(SinaburoConstant.newLine.RN);
		
		if(!CollectionUtils.isEmpty(memberLargeList)){
		
			for (BeanMap memberLargeMap : memberLargeList) {
				sb.append(memberLargeMap.get("memberId")+"\t"+memberLargeMap.get("ppoint").toString()+"\t"+memberLargeMap.get("pointNum").toString()+"\t"+memberLargeMap.get("mp").toString());
				sb.append(SinaburoConstant.newLine.RN);
			}
		}
		/**結果ファイル作成*/
		String dateStr = new DateTool().format("yyyyMMdd_HHmmss",DateTool.getSystemDate());
		
		//20170508 SJIS文字化け対応
		String outStr = SinaburoUtil.addDoubleStr(csvService.getContents(pointCsvList, PointMigrationInfoCsv.class).replace("\"", "")+sb.toString());
		outStr = SinaburoUtil.toSJIS(outStr);
		FileUtil.write(memberMigrationInfoRegistForm.fileFullPath+"_"+dateStr, outStr.getBytes("Windows-31J"));
		//FileUtil.write(memberMigrationInfoRegistForm.fileFullPath+"_"+dateStr, SinaburoUtil.addDoubleStr(csvService.getContents(pointCsvList, PointMigrationInfoCsv.class).replace("\"", "")+sb.toString()).getBytes("Shift_JIS"));
		
		/**一括登録*/
		//result = memberService.memberAllRegist(memberCsvList, getAdmin());
		logger.info("一括更新件数:"+pointCsvList.size());

		return null;

	}
	
	public String setvalidatePointDate(String args) {
		Date date = null;
		SimpleDateFormat format = new SimpleDateFormat("yyyy/MM/dd");
		if(StringUtil.isBlank(args))
			return "";
		format.setLenient(false);
		
		try {
			date=format.parse(args);
		} catch (ParseException e) {
			return "";
		}
		format = new SimpleDateFormat("yyyyMMdd");
		return format.format(date);
	}

	
	
}

///**
// *
// */
//package jp.agentec.sinaburocast.action.batch;
//
//import jp.agentec.sinaburocast.action.AbstractAction;
//import jp.agentec.sinaburocast.common.util.PropertyUtil;
//import jp.agentec.sinaburocast.service.EnqueteService;
//
//import org.apache.log4j.Logger;
//import org.seasar.struts.annotation.Execute;
//
///**
// * @author arakawa
// *
// */
//public class MemberMigrationInfoRegist extends AbstractAction {
//	private final Logger logger = Logger.getLogger(getClass());
//
//	public EnqueteService enqueteService;
//
//	@Execute(validator=false)
//	public String index() throws Exception {
//
//		//アンケートステータスを未実施から実施中に変更する
//		enqueteService.updateStatusToEnforcement(PropertyUtil.getString("BATCH_UPDATE"));
//
//		//アンケートステータスを実施中から完了に変更する
//		enqueteService.updateStatusToComplete(PropertyUtil.getString("BATCH_UPDATE"));
//
//		return null;
//	}
//
//}