package net.w_horse.excelpojo.converter;

import java.text.SimpleDateFormat;
import java.util.Date;

import org.springframework.util.StringUtils;

import net.w_horse.excelpojo.ExcelPOJOException;

/**
 * セルとフィールドに対する日付変換するクラス<br>
 * 文字列とDat型、文字列と文字列（フォーマット変換）に対する相互変換を行う<br>
 * 例えばフォーマット：yyyy/MM/ddの文字列とフォーマット：yyyy-MM-ddの相互変換を行う。<br>
 * 初期状態では文字列の フォーマット：yyyy/MM/dd と
 * 文字列の フォーマット：yyyyMMdd の相互変換を行う。<br>
 *
 *
 * @author kawahara
 *
 */
public class StringDateConverter implements CellFieldConverter {
	private String cellType = String.class.getName();
	private String cellFormat = "yyyy/M/d";
	private String fieldType = String.class.getName();
	private String fieldFormat = "yyyyMMdd";

	public StringDateConverter() {
	}

	@Override
	public Object convertField2Cell(Object value) throws ExcelPOJOException {
		return convert(value, fieldType, fieldFormat, cellType, cellFormat);
	}

	@Override
	public Object convertCell2Field(Object value) throws ExcelPOJOException {
		return convert(value, cellType, cellFormat, fieldType, fieldFormat);
	}

	private Object convert(Object value, String fromType, String fromFormat,
				String toType, String toFormat) throws ExcelPOJOException{
		if ((value == null)
			|| ((value instanceof String) && !StringUtils.hasLength((String) value))
		) {	// 値がない場合はそのまま返す
			return value;
		}

		try {
			// Date→Stringの変換
			if (fromType.equals(Date.class.getName())
				&& (toType.equals(String.class.getName()))
			) {
				return (new SimpleDateFormat(toFormat)).format(value);
			}

			// String→Stringの変換
			if (fromType.equals(String.class.getName())
				&& (toType.equals(String.class.getName()))
			) {
				Date theDate = (new SimpleDateFormat(fromFormat)).parse((String) value);
				return (new SimpleDateFormat(toFormat)).format(theDate);
			}

			// String→Dateの変換
			if (fromType.equals(String.class.getName())
				&& (toType.equals(Date.class.getName()))
			) {
				Date theDate = (new SimpleDateFormat(fromFormat)).parse((String) value);
				return theDate;
			}

			// それ以外は例外
			String msg = String.format("An illegal type is specified between [%s] and [%s].\n"
					+ "Only between String and Date can be specified for a conversion type.",
					cellType, fieldType);
			throw new IllegalArgumentException(msg);
		} catch (Exception e) {
			throw new ExcelPOJOException(e);
		}

	}

	public void setCellType(String cellType) {
		this.cellType = cellType;
	}
	public void setCellFormat(String cellFormat) {
		this.cellFormat = cellFormat;
	}
	public void setFieldType(String fieldType) {
		this.fieldType = fieldType;
	}
	public void setFieldFormat(String fieldFormat) {
		this.fieldFormat = fieldFormat;
	}

}
