package cn.hmsoft.jdbc.generator;

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

import cn.hmsoft.jdbc.entity.DateFormatType;
import cn.hmsoft.jdbc.entity.QueryOrder;
import cn.hmsoft.jdbc.entity.Table;
import cn.hmsoft.jdbc.entity.ValueCompareType;

/**************************
 * 定义数据库SQL语句生成的接口，所有数据库自动生成SQL语句都必须实现该接口
 * 
 * @author zxq
 * @create 2019-05-05 08:15:34
 * @version 2.0.0
 * @email: revisit@126.com
 * @Company: www.hmsoft.cn
 */
public interface ISQLGenerator {
	/**********************************
	 * 生成统计某张表所有记录的sql语句
	 * 
	 * @param clazz
	 *            表对应的实体类
	 */
	public String count(Class<?> clazz);

	/************************
	 * 生成统计某个字段值的记录的sql语句
	 * 
	 * @param clazz
	 *            表对应的实体类
	 * @param columnName
	 *            字段名称
	 */
	public String count(Class<?> clazz, String columnName);

	/**************************
	 * 
	 * 生成统计某个字段值的记录的sql语句
	 * 
	 * @param clazz
	 *            表对应的实体类
	 * @param columnName
	 *            字段名称 compareType 比较符
	 */
	public String count(Class<?> clazz, String columnName, ValueCompareType compareType);

	/****************************
	 * 根据sql统计执行sql语句
	 * 
	 * @param sql
	 * @return
	 */
	public String count(String sql);

	/******************************************
	 * 生成sql语句：根据主键删除记录
	 * 
	 * @param clazz
	 *            表对应的实体类
	 */
	public String delete(Class<?> clazz);

	/**********************************************
	 * 生成sql语句：通过某个具体的字段名
	 * 
	 * @param clazz
	 * @param columnName
	 */
	public String delete(Class<?> clazz, String columnName);

	/**********************************************
	 * 生成sql语句：通过某个具体的字段名
	 * 
	 * @param clazz
	 *            表对应类名
	 * @param columnName
	 *            表字段
	 * @param compareType
	 *            比较类型
	 */
	public String delete(Class<?> clazz, String columnName, ValueCompareType compareType);

	/**********************************************
	 * 生成sql语句：通过map生成修改语句
	 * 
	 * @param clazz
	 * @param columnMap
	 * @param conditionMap
	 */
	public String updateByMap(Class<?> clazz, Map<String, Object> columnMap, Map<String, Object> conditionMap);

	/***************************************************
	 * 插入单条记录
	 * 
	 * @param clazz
	 *            表对应的实体类
	 */
	public String insert(Class<?> clazz, Map<String, Object> columnMap);

	/*****************************************************************
	 * 根据实体更新单条记录
	 * 
	 * @param clazz
	 *            表对应的实体类
	 * @param paramMap
	 *            参数列表
	 */
	public String update(Class<?> clazz, Map<String, Object> paramMap);

	/******************************
	 * 生成获取sequence的sql语句，为兼容各数据库，返回多个sql语句
	 * 
	 * @param sequenceName
	 *            序列名称
	 */
	public String[] getNextSequence(String sequenceName);

	/*************************
	 * 查询指定表的所有记录
	 * 
	 * @param clazz
	 *            表对应的实体类
	 * @return
	 */
	public String all(Class<?> clazz);

	/*************************
	 * 查询指定表的所有记录
	 * 
	 * @param clazz
	 *            表对应的实体类
	 * @param order
	 *            排序
	 */
	public String all(Class<?> clazz, QueryOrder order);

	/***********************************
	 * 生成sql语句：根据某个字段查询记录
	 * 
	 * @param clazz
	 *            表对应的实体类
	 * @param columnName
	 *            字段名称
	 * 
	 */
	public String list(Class<?> clazz, String columnName);

	public String list(Class<?> clazz, String columnName, QueryOrder order);

	/***********************************
	 * 生成sql语句：根据某个字段查询记录
	 * 
	 * @param clazz
	 *            表对应的实体类
	 * @param columnName
	 *            字段名称
	 * @param compareType
	 *            比较类型
	 */
	public String list(Class<?> clazz, String columnName, ValueCompareType compareType);

	/******************************
	 * 生成sql语句：根据某个字段查询记录并排序
	 * 
	 * @param clazz
	 *            表对应的实体类
	 * @param columnName
	 *            字段名称
	 * @param compareType
	 *            比较类型
	 * @param order
	 *            排序规则
	 */
	public String list(Class<?> clazz, String columnName, ValueCompareType compareType, QueryOrder order);

	/*************************
	 * 生成sql语句：根据多个字段查询记录
	 * 
	 * @param clazz
	 *            表对应的实体类
	 * @param columns
	 *            多个字段集合
	 */
	public String list(Class<?> clazz, List<String> columns);

	/*************************
	 * 生成sql语句：根据多个字段查询记录
	 * 
	 * @param clazz
	 *            表对应的实体类
	 * @param columns
	 *            多个字段集合
	 * @param order
	 *            排序
	 */
	public String list(Class<?> clazz, List<String> columns, QueryOrder order);

	/****************************
	 * 生成sql语句：分页查询所有记录
	 * 
	 * @param clazz
	 * @param start
	 * @param limit
	 * @return
	 */
	public String list(Class<?> clazz, int start, int limit);

	/*****************************************************************
	 * 生成分页查询的sql语句
	 * 
	 * @param clazz
	 *            表对应的实体类
	 * @param sql
	 *            sql语句
	 * @param start
	 *            开始记录编号，第一条记录从1开始
	 * @param limit
	 *            返回的记录数
	 */
	public String list(String sql, int start, int limit);

	public String list(String sql, int start, int limit, QueryOrder order);

	public String list(Class<?> clazz, int start, int limit, QueryOrder order);

	public String list(Class<?> clazz, int start, int limit, String columnName);

	public String list(Class<?> clazz, int start, int limit, String columnName, QueryOrder order);

	public String list(Class<?> clazz, int start, int limit, String columnName, ValueCompareType compareType);

	public String list(Class<?> clazz, int start, int limit, String columnName, ValueCompareType compareType,
			QueryOrder order);

	/****************************
	 * 查询当前指定数据库的所有表格
	 * 
	 * @param databaseName
	 *            数据库名称
	 * @return
	 */
	public String queryTables(String databaseName);

	/***************************
	 * 查找指定表格的字段
	 * 
	 * @param databaseName
	 *            数据库名称
	 * @param tableName
	 *            表格名称
	 * @return
	 */
	public String queryColumns(String databaseName, String tableName);

	/**************************
	 * 查询数据库当前时间,返回的数据时间放到 t01中
	 */
	public String queryCurrentTime();

	/******************************
	 * 删除指定表表的所有数据
	 * 
	 * @param clazz
	 *            表格对应的实体
	 */
	public String deleteAll(Class<?> clazz);

	/***********************
	 * 查询一个blob字段
	 * 
	 * @param clazz
	 *            表对应的实体类
	 * @param columnName
	 *            blob字段名称
	 */
	public String updateBlob(Class<?> clazz, String columnName);

	/*****************************
	 * 更新blob字段
	 * 
	 * @param clazz
	 *            表对应的实体类
	 * @param columnName
	 *            blob字段名称
	 */
	public String queryBlob(Class<?> clazz, String columnName);

	/***********************
	 * 根据主键查找一条记录
	 * 
	 * @param clazz
	 *            表对应的实体类
	 */
	public String find(Class<?> clazz);

	/************************
	 * 随机记录数
	 * 
	 * @param clazz
	 *            表对应的实体类
	 * @param rowCount
	 *            需要获取的数量
	 */
	public String random(Class<?> clazz, int rowCount);

	/************************
	 * 随机记录数
	 * 
	 * @param sql
	 *            需要执行的sql语句
	 * @param rowCount
	 *            需要获取的数量
	 */
	public String random(String sql, int rowCount);

	/******************************
	 * 生成like参数
	 */
	public String like(String value);

	/******************************
	 * 生成如果为空参数
	 */
	public String isNull(String columnName);

	/******************************
	 * 生成如果为空参数
	 */
	public String isNull(String columnName, String otherColumn);

	/******************************
	 * 随机数
	 */
	public String random();

	/*********************
	 * 对多个值进行合并
	 */
	public String concatValues(String columnName);

	/***********************
	 * 短日期格式化
	 */
	public String formatDate(String columnName, DateFormatType format);

	public Table getTable(Class<?> clazz);
}
