/*  OpenOlap viewer
 *  パッケージ名：openolap.viewer.export
 *  ファイル：ExportReport.java
 *  説明：
 *
 *  作成日: 2004/01/31
 */
package openolap.viewer.export;

import java.util.ArrayList;

import openolap.viewer.Axis;
import openolap.viewer.Edge;
import openolap.viewer.common.StringUtil;
import openolap.viewer.controller.RequestHelper;

/**
 *  クラス：ExportReport
 *  説明：
 */
public abstract class ExportReport {

	public abstract String exportReport(RequestHelper helper);


	// ********** protectedメソッド **********	

	/**
	 * @param edge
	 * @param axis
	 * @param rowIndex
	 * @return
	 */
	protected boolean isPrintPoint(Edge edge, Axis axis, int rowIndex) {
		Integer nextComboNums = edge.getNextAxesMembersComboNums(axis);
		
		if (nextComboNums == null) {// 最終段の場合、常に表示対象
			return true;
		} else { // 最終段以外の場合
			if ( (rowIndex % nextComboNums.intValue() == 0)) {//結合セルの先頭のIndex
				return true;
			} else {
				return false;			
			}
		}
	}

	// 行・列メンバのセル結合数を求める
	protected int getCellMergeNum(Edge edge, Axis axis) {

		Integer cellMergeNumber = edge.getNextAxesMembersComboNums(axis);
//System.out.println(colMergeNumber);		
		int mergeNum;
		if (cellMergeNumber != null) {
			mergeNum = cellMergeNumber.intValue()-1;
		} else {
			mergeNum = 0;									
		}
		
		return mergeNum;
	}

	protected int getNextSpreadIndex(Edge edge, Axis axis, int x) {
		
		Integer cellMergeNumber = edge.getNextAxesMembersComboNums(axis);
//System.out.println(colMergeNumber);		
		int mergeNum;
		if (cellMergeNumber != null) {
			mergeNum = cellMergeNumber.intValue();
		} else {
			mergeNum = 1;									
		}
		
		return ( x + mergeNum );
		
	}

	// 列メンバの繰り返し数を求める
	protected int getBeforeComboNum(Edge edge, Axis axis) {
		
		Integer axisMemRepeatNumber = edge.getBeforeAxesMembersComboNums(axis);
//System.out.println(axisMemRepeatNumber);
		int axisMemRepeatNum;
		if (axisMemRepeatNumber != null) {
			axisMemRepeatNum = axisMemRepeatNumber.intValue();
		} else {
			axisMemRepeatNum = 1;	// 0段の場合、一度だけ繰り返す
		}
		return axisMemRepeatNum;
	}

	/**
	 * 指定された段の軸メンバが結合される対象（表示対象外）かどうかを確認する。
	 * 一つ前の行/列に配置された軸メンバのKeyの組み合わせと自分のKeyの組み合わせを比較し、
	 * 指定された段およびそれより上位の段のKeyが異なる場合は表示対象、等しい場合は表示対象外とする
	 * @param beforeKeys
	 * @param keys
	 * @param hieIndex
	 * @return
	 */
	protected boolean isJoinMember(String beforeKeys, String keys, int hieIndex) {

		if (beforeKeys == null) {
			return false;
		}

		ArrayList keyList = StringUtil.splitString(keys, ";");
		ArrayList beforeKeyList = StringUtil.splitString(beforeKeys, ";");

		for (int i = 0; i < hieIndex+1; i++) {	// 指定された段およびその上段のKeyは同じかを確認
			String key = (String) keyList.get(i);
			String beforeKey = (String) beforeKeyList.get(i);
			if (!key.equals(beforeKey)){
				return false;
			}
		}
		return true;
	}

}
