import mcframe.commonCore.lang.*;
import mcframe.commonCore.container.*;
import static mcframe.commonFXUC.FXUCC0010.FXUCC_DataUtil.*;

import java.util.HashMap;
import java.util.Map;

public class TableAu {
	// 縦テーブルのグループ処理項目リスト
	public String[] v_gp_cols;
	
	// 縦テーブルの項目リスト 
	public String[] v_cols;

	// 縦テーブルのIndexカラム項目リスト 
	// 設定しない場合：行No.となる
	public String[] v_i_cols;
	
	// 横テーブルのグループ処理項目リスト
	public String[] h_gp_cols;
	
	// 横テーブルの項目リスト
	public String[] h_cols;
			
	//グループインデックス開始値
	public int idxFr = 1;

	//グループインデックス終了値
	public int idxTo = 20;
	
	public TableAu(String[] h_cols,String[] v_cols, int idxFr, int idxTo) {
		this.h_cols = h_cols;
		this.v_cols = v_cols;
		
		this.idxFr = idxFr;
		this.idxTo = idxTo;
	}
	
	public TableAu(String[] h_cols, int idxFr, int idxTo) {
		this.h_cols = h_cols;
		this.v_cols = h_cols;
		
		this.idxFr = idxFr;
		this.idxTo = idxTo;
	}
	
	public String idxColFormat = "%s_%d";
	
	protected Map<String, Integer> _idxColMap;
	
	// Idxカラムを取得
	 public Map<String, Integer> getIdxColMap() {
		 if(_idxColMap == null) {
			 _idxColMap = new HashMap<>();
			
			for(int idx=idxFr; idx<=idxTo; idx++) {
				for(String idxCol : h_cols) {
					String idxColNm = getIdxColNm(idxCol, idx);
					_idxColMap.put(idxColNm, idx);
				}
			}
		 }
		 return _idxColMap;
	 }
	 
	// グループ内の項目名を取得
	public String getIdxColNm(String idxCol, int idx ) {
		return String.format(idxColFormat, idxCol, idx);
	}
	
	// Idxを取得
	// 存在しない時の戻り値 ：-1 
	public int getIdx(String idxColNm) {
		if(getIdxColMap().containsKey(idxColNm)) {
			return getIdxColMap().get(idxColNm);
		}
		return -1;
	}
	
	// true: Idxカラム
	public boolean isIdxColNm(String idxColNm) {
		return isIdxColNm(idxColNm, null);
	}
	
	public boolean isIdxColNm(String idxColNm, String idxCol) {
		int idx = getIdx(idxColNm);
		if(idx == -1) {
			return false;
		}
		
		if(idxCol != null && !isSame(idxCol, "")) {
			if(! isSame(idxColNm, getIdxColNm(idxCol, idx))) {
				return false;
			}
		}
		
		return true;
	}
	
	// true:開始のIdx
	public boolean isFirstIdx(int idx) {
		return idx == idxFr;
	}
	
	// true:終了のIdx
	public boolean isLastIdx(int idx) {
		return idx == idxTo;
	}
	
	// グループ項目の第１個目の値がある項目名を取得
	// すべて未入力値の場合：null を戻す
	public String getFirstIdxColNmHasVal(MCRow r, int idx) {
		for(String idxCol : h_cols) {
			String idxColNm = getIdxColNm(idxCol, idx);
			if(isNull(r.getValue(idxColNm))==false) {
				return idxColNm;
			}
		}
		return null;
	}
	
	// グループ項目が未入力の場合、trueを戻す
	public boolean isEmpty(MCRow r, int idx) {
		String idxColNm = getFirstIdxColNmHasVal(r, idx);
		
		if(isNull(idxColNm)==false) {
			return true;
		}

		return true;
	}
	
	// １個目の空Idxを取得
	public int getFirstEmptyIdx(MCRow r) {
		for(int idx= idxFr; idx<=idxTo; idx++) {
			if(isEmpty(r,idx)) {
				return idx;
			}
		}
		
		return -1;
	}
	
	// 値クリア
	public void clear(MCRow r, int idx) {
		for(String idxCol : h_cols) {
			String idxColNm = getIdxColNm(idxCol, idx);
			r.setValueNE(idxColNm, null);
		}
	}
	
	public void clear(MCRow r, int idxF, int idxT) {
		for(String idxCol : h_cols) {
			for(int idx=idxF; idx <= idxT; idx++) {
				String idxColNm = getIdxColNm(idxCol, idx);
				r.setValueNE(idxColNm, null);
			}
		}
	}
	
	// 値コピー
	public void copy (MCRow r, int idxF, int idxT) {
		for(String idxCol : h_cols) {
			String idxColNmF = getIdxColNm(idxCol, idxF);
			String idxColNmT = getIdxColNm(idxCol, idxT);
			r.setValueNE(idxColNmT, r.getValue(idxColNmF));
		}
	}
	
	// 値移動　移動後のIdxをクリア
	public void move (MCRow r, int idxF, int idxT) {
		for(String idxCol : h_cols) {
			String idxColNmF = getIdxColNm(idxCol, idxF);
			String idxColNmT = getIdxColNm(idxCol, idxT);
			r.setValueNE(idxColNmT, r.getValue(idxColNmF));
			r.setValueNE(idxColNmF, null);
		}
	}
	
	// 横持ちデータ設定（１行目のみ）
	public void setHColVal(MCRow hR, MCList<?> vL) {
		int to = vL.size();
		
		if(to > idxTo) {
			to = idxTo;
		}
		
		for(int idx= idxFr; idx<=to; idx++) {
			MCRow srcR = srcLst.get(idx-1);
			
			for(int i=0; i<h_cols.length; i++ ) {
				String idxColNm = getIdxColNm(h_cols[i], idx);
				destR.setValueNE(idxColNm, srcR.getValue(v_cols[i]));
			}
		}
	}
	
	// 横持ちデータ設定
	// パラメータ.rsltLst : コピーされた行を格納するMCList
	public void setHColVal(MCList<MCRow> hL, MCList<?> vL, MCGroupByPolicy gp) {
		int to = srcLst.size();
		
		int pages = 1;
		MCRow destTmpR = destR;
		MCRow destOrg = destR.clone();
		
		int idx = idxFr-1;
		for(int i= 1; i<=to; i++) {
			MCRow srcR = srcLst.get(i);
			idx++;
			
			if(idx > idxTo) {
				pages++;
				idx=idxFr;
				destTmpR= destOrg.clone();
				rsltLst.add(destTmpR);
			}
			
			for(int j=0; j<h_cols.length; j++ ) {
				String idxColNm = getIdxColNm(h_cols[j], idx);
				destTmpR.setValueNE(idxColNm, srcR.getValue(v_cols[i]));
			}
		}
	}
	
	// 行を指定回数コピー
	// パラメータ.rsltLst : コピーされた行を格納するMCList
	public static void copyRows(MCRow destR, int times, MCList<MCRow> rsltLst) {
		for(int i=0; i<times; i++) {
			rsltLst.add(destR.clone());
		}
	}
	
	// 歯抜けチェック
	// 戻り値：１個目の項目名
	// 歯抜けなし：nullを戻す
	public String checkGap(MCRow r) {
		boolean isPriorEmpty = false;
		for(int idx= idxFr; idx<=idxTo; idx++) {
			String idxColNm = getFirstIdxColNmHasVal(r, idx);
			
			if(isPriorEmpty==true && isNull(idxColNm)==false) {
				return 	idxColNm;
			}
			
			isPriorEmpty=isNull(idxColNm);
		}
		
		return null;
	}
		
	// 値詰め
	public void clearGap(MCRow r) {
		int idx_empty = -1;
		
		for(int idx= idxFr; idx<=idxTo; idx++) {
			if(isEmpty(r,idx)) {
				if(idx_empty==-1) {
					idx_empty = idx;
				}
			}else {
				if(idx_empty != -1) {
					move(r,idx,idx_empty);
					idx_empty=-1;
				}
			}
		}

	}
	
	//////////////////////////////////////////////////////////////////////////////////////
	// Ex. 画面表示歯抜け制御 
	// Idxを取得 >0 時 (idx)
	// １個目の空Idxを取得を取得(idx_empty)
	// if(idx > idx_empty) 入力不可
	
}