/**
 * 
 */
package org.springblade.datasource;

import org.springblade.datasource.enums.*;
import org.springblade.datasource.model.TableColumnDto;
import org.springblade.datasource.model.TableViewDto;
import org.springblade.etl.dto.FileStructure;
import org.springblade.etl.entity.bi.ReportDatasource;

import java.util.List;

/**
 * @author wookvn
 *
 *	
 */
public interface IGmetryDialect {

	/**
	 * 查询表或视图列表
	 * @param datasourceId
	 * @return
	 */
	public List<TableViewDto> listTableViewsByDatasource(ReportDatasource datasource);
	
	public List<TableViewDto> listTableViewsByDatasource(ReportDatasource datasource, String tableViewName);
	
	/**
	 * 查询字段列表
	 * @param datasourceId
	 * @param tableViewName
	 * @return
	 */
	public List<TableColumnDto> listTableColumnsByTableViewName(ReportDatasource datasource, String tableViewName);
	
	/**
	 * 通过上传的文件生成创建表的SQL
	 * @param tableName
	 * @param tableComment
	 * @param structureList
	 * @return
	 */
	public List<String> buildCreateTableSql(String tableName, String tableComment, List<FileStructure> structureList);
	
	/**
	 * 构造创建视图的SQL
	 * @param viewName
	 * @param sqlStatement
	 * @return
	 */
	public String buildCreateViewSql(String viewName, String sqlStatement);
	
	/**
	 * 数据的类型转换
	 * @param oldColumnType
	 * @param columnType
	 * @param columnSql
	 * @param dateFormat
	 * @return
	 */
	public String convertDataType(ViewColumnTypeEnum oldColumnType, ViewColumnTypeEnum newColumnType, String columnSql, DateFormatEnum dateFormat);
	
	/**
	 * 获取字段类型数据
	 * @return
	 */
	public String getColumnType(ColumnTypeEnum columnType);
	
	/**
	 * 获取日期格式化后的字符串
	 * @param dateTimeFormat
	 * @return
	 */
	public String formatDateTime(DateFormatEnum dateTimeFormat, String columnSql);
	
	/**
	 * 获取方法函数格式化后的字符串
	 * @param params
	 * @return
	 */
	public String formatMethodFunction(FunctionMethodEnum functionMethod, Object... args);
	
	/**
	 * 数据源类型
	 * @return
	 */
	public DsTypeEnum dsType();
	
	/**
	 * 获取DB Schema
	 * @param datasource
	 * @return
	 */
	default String dbSchema(ReportDatasource datasource) {
		return datasource.getDsDb();
	}
	
	/**
	 * 获取SELECT SQL的表名，比如：SQLServer需要特殊处理。 dbo.xxx_table
	 * @param datasource
	 * @param tableName
	 * @return
	 */
	default String dbTableName(ReportDatasource datasource, String tableName) {
		return dbEscape(tableName);
	}
	
	/**
	 * 数据库转义处理 - 比如：mysql字段名和表名添加``
	 * @param datasource
	 * @param name
	 * @return
	 */
	default String dbEscape(String name) {
		return name;
	}
}
