package net.w_horse.excelpojo.excel.cellseeker;

import java.lang.annotation.Annotation;

import net.w_horse.excelpojo.ExcelPOJOBridge;
import net.w_horse.excelpojo.ExcelPOJOException;
import net.w_horse.excelpojo.annotation.ExcelPOJOAnnotationParser;
import net.w_horse.excelpojo.converter.CellFieldConverter;
import net.w_horse.excelpojo.excel.CellNotFoundException;
import net.w_horse.excelpojo.excel.cellseeker.AbstractCellSeeker.Offset;

import org.apache.poi.ss.usermodel.Sheet;

public interface CellSeeker extends Cloneable {

	/**
	 * アノテーションパーサーに定義情報をセットしてもらう
	 *
	 * @param annotation アノテーション
	 * @param parser アノテーションパーサー
	 * @throws ClassNotFoundException listClassで無効なクラスが指定されていた場合
	 * @throws LinkageError listClassで無効なクラスが指定されていた場合
	 * @throws ExcelPOJOException その他例外
	 */
	void set(Annotation annotation, ExcelPOJOAnnotationParser parser) throws ClassNotFoundException, LinkageError, ExcelPOJOException;

	/**
	 * セルの検索を行い、値を取得する。
	 *
	 * @param sheet 検索対象（読み込み）のシート
	 * @param requiredType 取得する値の型
	 * @return セルを検索した結果の値
	 * @throws ClassNotFoundException listClassで無効なクラスが指定されていた場合
	 * @throws LinkageError listClassで無効なクラスが指定されていた場合
	 * @throws CellNotFoundException use="required"が指定されていた際にセルが見つからない場合
	 * @throws IllegalArgumentException 定義に誤り・矛盾がある場合
	 * @throws ExcelPOJOException その他例外
	 */
	Object seekCellValue(Sheet sheet, Class<?> requiredType) throws ClassNotFoundException, LinkageError, CellNotFoundException, IllegalArgumentException, ExcelPOJOException;

	/**
	 * セルの検索を行い、値をセットする。
	 *
	 * @param sheet 検索対象（書き込み）のシート
	 * @param value 書き込む値
	 * @throws CellNotFoundException use="required"が指定されていた際にセルが見つからない場合
	 * @throws IllegalArgumentException 定義に誤り・矛盾がある場合
	 * @throws ExcelPOJOException その他例外
	 */
	void setValue(Sheet sheet, Object value) throws CellNotFoundException, IllegalArgumentException, ExcelPOJOException;

	/**
	 * セルの検索を行い、値をセットする。<br>
	 * 基点からセルを検索し、そこからの相対位置を指定して値をセットする。
	 *
	 * @param sheet 書き込み対象のシート
	 * @param basePosition 基点
	 * @param offset 相対位置
	 * @param value 値
	 * @throws CellNotFoundException use="required"が指定されていた際にセルが見つからない場合
	 * @throws ExcelPOJOException その他例外
	 */
	void setValue(Sheet sheet, Offset basePosition, Offset offset, Object value) throws CellNotFoundException, ExcelPOJOException;

	/**
	 * 実行時に定義内容の妥当性チェックを行う<br>
	 * 定義に誤りや矛盾がある場合は {@link IllegalArgumentException}をあげる
	 *
	 * @return true:妥当 / false:誤りがある（例外があがる）
	 * @throws IllegalArgumentException 定義に誤りや矛盾がある場合
	 * @throws ExcelPOJOException listClassで無効なクラスが指定されていた場合
	 */
	boolean verify() throws IllegalArgumentException, ExcelPOJOException;

	void setExcelPOJOBridge(ExcelPOJOBridge excelPOJOBridge);
	ExcelPOJOBridge getExcelPOJOBridge();
	void setUse(String use);
	String getUse();
	void setRange(String range);
	String getRange();
	void setConverter(CellFieldConverter converter);
	CellFieldConverter getConverter();
}
