package jp.terasoluna.batch.functionsample.b000;

import java.util.ArrayList;
import java.util.List;

import jp.terasoluna.fw.batch.blogic.BLogic;
import jp.terasoluna.fw.batch.blogic.vo.BLogicParam;
import jp.terasoluna.fw.batch.util.MessageUtil;
import jp.terasoluna.fw.batch.util.ValidationUtil;
import jp.terasoluna.fw.file.dao.FileLineIterator;
import jp.terasoluna.fw.file.dao.FileLineWriter;
import jp.terasoluna.fw.file.dao.FileQueryDAO;
import jp.terasoluna.fw.file.dao.FileUpdateDAO;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.validation.Errors;
import org.springframework.validation.FieldError;
import org.springframework.validation.Validator;

/**
 * ファイル関連ジョブのサンプル<br>
 * <br>
 * 
 * 事前準備：C:\tmp配下にinput.csvファイルを配置すること <br>
 * <br>
 * サンプル内容： input.csvファイルを読み取り、入力チェックを行うサンプル。
 * 
 * 
 */
public class B000004BLogic implements BLogic {

	private Log log = LogFactory.getLog(B000004BLogic.class);

	private static final int BATCH_NORMAL_END = 0;
	private static final int BATCH_ABNORMAL_END = 255;

	@Autowired
	@Qualifier("csvFileQueryDAO")
	private FileQueryDAO csvFileQueryDAO = null;

	@Autowired
	@Qualifier("csvFileUpdateDAO")
	private FileUpdateDAO csvFileUpdateDAO = null;

	@Autowired
	@Qualifier("beanValidator")
	private Validator beanValidator = null;

	public int execute(BLogicParam arg0) {

		int returnCode = BATCH_NORMAL_END;

		FileLineIterator<CsvRecord> recordIterator = csvFileQueryDAO.execute(
				"C:\\tmp\\input2.csv", CsvRecord.class);

		FileLineWriter<CsvRecord> fileLineWriter = csvFileUpdateDAO.execute(
				"C:\\tmp\\result.csv", CsvRecord.class);

		List<String> header = new ArrayList<String>();
		header.add("header");
		List<String> footer = new ArrayList<String>();
		footer.add("footer");

		try {
			// ヘッダ部の出力
			fileLineWriter.printHeaderLine(header);

			while (recordIterator.hasNext()) {
				CsvRecord record = recordIterator.next();
				log.info("ID:" + record.getId() + " FIMILYNAME:"
						+ record.getFamilyName() + " FIRSTNAME:"
						+ record.getFirstName() + " AGE:" + record.getAge());

				// 入力チェック
				Errors errors = ValidationUtil.validate(beanValidator, record);
				if (errors.hasErrors()) {
					List<FieldError> fes = ValidationUtil
							.getFieldErrorList(errors);

					for (FieldError fe : fes) {
						// エラーメッセージをログに出力
						if (log.isErrorEnabled()) {
							log.error(MessageUtil.getMessage(fe.getCode(), fe
									.getArguments()));
						}
					}
					returnCode = BATCH_ABNORMAL_END;
					continue;
				}

				// データ部の出力
				fileLineWriter.printDataLine(record);

			}
			// フッダ部の出力
			fileLineWriter.printTrailerLine(footer);
		} finally {
			// ファイルのクローズ
			recordIterator.closeFile();
			fileLineWriter.closeFile();
		}

		// 正常終了
		return returnCode;
	}

}
