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

import cn.hutool.core.util.StrUtil;
import org.springblade.datasource.enums.DateFormatEnum;
import org.springblade.datasource.enums.DsTypeEnum;
import org.springblade.datasource.enums.FunctionMethodEnum;
import org.springblade.datasource.enums.ViewColumnTypeEnum;
import org.springblade.datasource.model.TableColumnDto;
import org.springblade.datasource.model.TableViewDto;
import org.springblade.datasource.model.DatasourceDto;
import org.springblade.datasource.model.FileStructureDto;

import java.util.List;

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

	/**
	 * 查询表或视图列表
	 * @param datasource
	 * @return
	 */
	public List<TableViewDto> listTableViewsByDatasource(DatasourceDto datasource);

	/**
	 * 查询某一个视图或表的信息
	 * @param datasource
	 * @param tableViewName
	 * @return
	 */
	public List<TableViewDto> listTableViewsByDatasource(DatasourceDto datasource, String tableViewName);
	
	/**
	 * 查询字段列表
	 * @param datasource
	 * @param tableViewName
	 * @return
	 */
	public List<TableColumnDto> listTableColumnsByTableViewName(DatasourceDto datasource, String tableViewName);
	
	/**
	 * 通过上传的文件生成创建表的SQL
	 * @param tableName
	 * @param tableComment
	 * @param structureList
	 * @return
	 */
	public List<String> buildCreateTableSql(String tableName, String tableComment, List<FileStructureDto> structureList);
	
	/**
	 * 构造创建视图的SQL
	 * @param viewName
	 * @param sqlStatement
	 * @return
	 */
	public String buildCreateViewSql(String viewName, String sqlStatement);
	
	/**
	 * 数据的类型转换
	 * @param oldColumnType
	 * @param newColumnType
	 * @param columnSql
	 * @param dateFormat
	 * @return
	 */
	public String convertDataType(ViewColumnTypeEnum oldColumnType, ViewColumnTypeEnum newColumnType, String columnSql, DateFormatEnum dateFormat);
	
	/**
	 * 获取字段类型数据
	 * @param columnType
	 * @return
	 */
	public String getColumnType(ViewColumnTypeEnum columnType, Integer columnSize, Integer decimalDigits);
	
	/**
	 * 获取日期格式化后的字符串
	 * @param dateTimeFormat
	 * @return
	 */
	public String formatDateTime(DateFormatEnum dateTimeFormat, String columnSql);
	
	/**
	 * 获取方法函数格式化后的字符串
	 * @param functionMethod
	 * @param args
	 * @return
	 */
	public String formatMethodFunction(FunctionMethodEnum functionMethod, Object... args);
	
	/**
	 * 数据源类型
	 * @return
	 */
	public DsTypeEnum dsType();

	/**
	 * 获取DB Schema
	 * @param datasource
	 * @return
	 */
	default String dbSchema(DatasourceDto datasource) {
		return StrUtil.isBlank(datasource.getDbSchema()) ? datasource.getDsUser() : datasource.getDbSchema();
	}

	/**
	 * 获取SELECT SQL的表名，比如：SQLServer需要特殊处理。 dbo.xxx_table
	 * @param datasource
	 * @param tableName
	 * @return
	 */
	default String dbTableName(DatasourceDto datasource, String tableName) {
		return quoteIdentifier(tableName);
	}

	/**
	 * 数据库转义处理 - 比如：mysql字段名和表名添加``
	 * @param name
	 * @return
	 */
	default String quoteIdentifier(String name) {
		return name;
	}

	/**
	 * 执行SQL
	 * @param sqls
	 */
	public void executeSql(List<String> sqls, DatasourceDto datasource) throws Exception;

}
