/*
 * MosP - Mind Open Source Project    http://www.mosp.jp/
 * Copyright (C) MIND Co., Ltd.       http://www.e-mind.co.jp/
 * 
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the GNU General Public License
 * as published by the Free Software Foundation; either version 2
 * of the License, or (at your option) any later version.
 * 
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 * 
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
 */
package jp.mosp.common.common;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.Date;

import jp.mosp.common.common.MospException;

import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.poifs.filesystem.POIFSFileSystem;

/**
 * Excelファイル読込ユーティリティ
 * <p>	2008/11/28	</p>
 * @author m.yoshida
 * @since		1.1.4
 * @version	0.0.2
 */
public class PoiReadUtility {

	/**
	 * シート名
	 */
	protected static final String SHEET_NAME = "Sheet1";

	/**
	 * POIFSFileSystem
	 */
	private POIFSFileSystem fs;

	/**
	 * ワークブック
	 */
	private HSSFWorkbook wb;
	
	/**
	 * シート
	 */
	private HSSFSheet sheet;
	
	/**
	 * 列
	 */
	private HSSFRow row;
	
	/**
	 * セル
	 */
	private HSSFCell cell;
	
	/**
	 * デフォルトコンストラクタ
	 */
	public PoiReadUtility() {
		// 処理無し
	}
	
	/**
	 * コンストラクタ
	 * @param filePath	絶対ファイルパス
	 */
	public PoiReadUtility(String filePath) {
		try {
			readFile(filePath);
			setWorkBook();
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
	
	/**
	 * コンストラクタ
	 * @param file		ファイル名
	 */
	public PoiReadUtility(File file) {
		try {
			readFile(file);
			setWorkBook();
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
	
	/**
	 * ファイルの読み込み
	 * @param filePath					絶対ファイルパス
	 * @throws FileNotFoundException
	 * @throws IOException
	 */
	private void readFile(String filePath) throws FileNotFoundException, IOException {
		fs = new POIFSFileSystem(new FileInputStream(filePath));
	}

	/**
	 * ファイルの読み込み
	 * @param file						ファイル名
	 * @throws FileNotFoundException
	 * @throws IOException
	 */
	private void readFile(File file) throws FileNotFoundException, IOException {
		fs = new POIFSFileSystem(new FileInputStream(file));
	}

	/**
	 * ワークブックの準備
	 * @throws IOException
	 */
	private void setWorkBook() throws IOException {
		wb = new HSSFWorkbook(fs);
	}

	/**
	 * シート取得
	 * @return sheet
	 */
	protected HSSFSheet getSheet() {
		return sheet;
	}

	/**
	 * シート設定
	 */
	protected void setSheet() throws MospException {
		sheet = wb.getSheet(SHEET_NAME);
		if (sheet == null) {
			throw new MospException(MospConst.EX_NO_SHEET, MospConst.LOG_MSG_1040);
		}
	}
	
	/**
	 * シート設定（指定シート）
	 * @param sheetname		シート名
	 * @throws MospException 
	 */
	protected void setSheet(String sheetname) throws MospException {
		sheet = wb.getSheet(sheetname);
		if (sheet == null) {
			setSheet();
		}
	}

	/**
	 * セル設定
	 * @param cellno	cell番号
	 */
	protected void setCell(short cellno) {
		cell = row.getCell(cellno);
	}

	/**
	 * 列設定
	 * @param row		row番号
	 */
	protected void setRow(HSSFRow row) {
		this.row = row;
	}

	/**
	 * セル取得
	 * @return	cell
	 */
	protected HSSFCell getCell() {
		return cell;
	}

	/**
	 * 列取得
	 * @return row
	 */
	protected HSSFRow getRow() {
		return row;
	}
	
	/**
	 * 列設定
	 * @param rowno		row番号
	 */
	protected void setRow(int rowno) {
		row = sheet.getRow(rowno);
	}
	
	/**
	 * セルの値取得（String型）
	 * @return 値
	 */
	protected String getStringCellValue() {
		return cell.getStringCellValue();
	}

	/**
	 * 指定セルの値取得（String型）
	 * @param cellno	cell番号
	 * @return 値
	 */
	protected String getStringCellValue(short cellno) {
		setCell(cellno);
		if (getCell() != null) {
			return cell.getStringCellValue();
		}
		return null;
	}
	
	/**
	 * セルの値取得（double型）
	 * @return 値
	 */
	protected double getNumberCellValue() {
		return cell.getNumericCellValue();
	}

	/**
	 * セルの値取得（Date型）
	 * @return 値
	 */
	protected Date getDateCellValue() {
		return cell.getDateCellValue();
	}

	/**
	 * 指定セルの値取得（String型）
	 * @param cellno	cell番号
	 * @return value
	 */
	protected String getCellValue(short cellno) {
		String value = "";
		setCell(cellno);
		if (getCell() != null) {
			if (cell.getCellType() == HSSFCell.CELL_TYPE_NUMERIC) {
				value = String.valueOf(Double.valueOf(getNumberCellValue()).intValue());
			} else if (cell.getCellType() == HSSFCell.CELL_TYPE_FORMULA) {
				value = cell.getCellFormula();
			} else if (cell.getCellType() == HSSFCell.CELL_TYPE_BLANK) {
				value = "";
			} else {
				value = getStringCellValue();
			}
		}		
		return value;
	}
	
}
