package com.takensoft.pohangTp.data.vo;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;

import com.takensoft.pohangTp.common.vo.CheckMessage;

import lombok.Getter;
import lombok.Setter;

@Getter
@Setter
public class DataTable extends Dataset{

	/**
	 * 시리얼 버전
	 */
	private static final long serialVersionUID = 1L;
	
	public DataTable () {};
	
	public DataTable (Dataset parents) {
		super.setDatasetId(parents.getDatasetId());
		super.setDatasetSj(parents.getDatasetSj());
		super.setDbConectId(parents.getDbConectId());
		super.setTableNm(parents.getTableNm());
		super.setTableNmKr(parents.getTableNmKr());
		super.setCreatTableAt(parents.isCreatTableAt());
		super.setCreatDt(parents.getCreatDt());
		super.setUpdtDt(parents.getUpdtDt());		
		super.setDatasetPostId(parents.getDatasetPostId());
		super.setStdizColumnAt(parents.isStdizColumnAt());
		super.setStdizDomnAt(parents.isStdizDomnAt());
		super.setStdizTableNm(parents.isStdizTableNm());
		super.setQuery(parents.getQuery());			
	};
	

	/**
	 * 열 기준 데이터 정보 (헤더 정보 + 열별 데이터 목록)
	 */
	private List<ColumnData> columnDatas = new ArrayList<ColumnData>();
	
	/**
	 * 데이터(행,열)
	 */	
	private List<List<Object>> rowData = new ArrayList<List<Object>>();
	
	/**
	 * 열 기준 데이터 정보 (헤더 정보 + 열별 데이터 목록)
	 */
	private List<ColumnData> changeColumnDatas = null;
	
	/**
	 * primary key 존재 여부
	 */	
	private boolean isExistPrimary = false;
	
	/**
	 * 헤더(컬럼)데이터를 현재 생성된 rowData 인스턴스에 0번째Index에 추가했는지에 대한 여부
	 */	
	private boolean isRowDataHeaderAdd = false;
	
	/**
	 * 헤더(컬럼)데이터의 columnName이 메모리상에서 변경된는 지에 대한 여부
	 */	
	private boolean isColumnNameChange = false;
	
	/**
	 * 데이터(행,열)의 컬럼인 Row의 Index
	 */
	private int rowDataColumnIndex;
	
	/**
	 * 데이터(행,열)의 Row 시작 Index
	 */
	private int startRowIndex;
	
	/**
	 * 데이터(행,열)의 Cell 시작 Index
	 */
	private int startCellIndex;
	
	/** 
	 * 총 개시물 수
	 */
	private int totalRows;
	
	/**
	 * 데이터 편집 결과 메세지(화면에서만 쓰임)
	 */
	private List<Map<String, String>> editResultList = new ArrayList<Map<String, String>>();
	
	/**
	 * DataTable 생성 관련 메세지
	 */
	private CheckMessage checkMessage = new CheckMessage();
	
	
	public void cellValuesClear() {
		for (int i = 0; i < columnDatas.size(); i++) {
			columnDatas.get(i).cellValuesClear();
		}
	}
	
	/**
	 * 컬럼 데이터 값 저장 
	 */
	/*
	public void setColumnValues(List<LinkedHashMap<String,Object>> datas) {
		this.setTotalRows(datas.size());
		for(LinkedHashMap<String,Object> temp : datas) {
			for(ColumnData columnData : this.columnDatas) {
				columnData.getColumnValues().add(new ColumnValue(temp.get(columnData.getColumnNm()),columnData.getDataTy()));
			}
		}
	}
	*/
	
	/**
	 * 쿼리 생성(DB포함) 
	 */
	public void setQuery() {
		StringBuilder builder = new StringBuilder();
		builder.append("SELECT \n");
		for (int i = 0; i < this.getColumnDatas().size(); i++) {
			builder.append("\t");
			if (i > 0) {
				builder.append(", ");
			}
			builder.append(this.getColumnDatas().get(i).getColumnNm());
			builder.append("\n");
		}
		builder.append("FROM \n\t");
		builder.append(this.getDatabaseNm());
		builder.append(".");
		builder.append(this.getTableNm());
		builder.append("\n");
		
		this.setQuery(builder.toString());		
	}
	
	/**
	 * 쿼리생성
	 */
	public String makeQuery() {
		StringBuilder builder = new StringBuilder();
		builder.append("SELECT \n");
		for (int i = 0; i < this.getColumnDatas().size(); i++) {
			builder.append("\t");
			if (i > 0) {
				builder.append(", ");
			}
			builder.append(this.getColumnDatas().get(i).getColumnNm());
			builder.append("\n");
		}
		builder.append("FROM \n\t");	
		builder.append(this.getTableNm());
		builder.append("\n");
		
		this.setQuery(builder.toString());
		
		return builder.toString();
	
	}
	
	
}
