using System.Data;
using System.Data.Common;

namespace PowerEasy.WebFuture.DataMigrations.Foundation.Provider
{
    /// <summary>
    /// 数据库提供者接口。
    /// </summary>
    public interface IDatabaseProvider
    {
        /// <summary>
        /// 检查链接是否开启。
        /// </summary>
        /// <returns>返回结果。</returns>
        bool CheckConnection();

        /// <summary>
        /// 执行非查询命令。
        /// </summary>
        /// <param name="sql">sql语句。</param>
        /// <param name="parameters">参数。</param>
        /// <returns>返回执行条数。</returns>
        public int ExecuteNonQuery(string sql, params DbParameter[] parameters);

        /// <summary>
        /// 执行查询并返回数据表。
        /// </summary>
        /// <param name="sql">sql语句。</param>
        /// <param name="parameters">参数。</param>
        /// <returns>返回数据表。</returns>
        public DataTable ExecuteDataTable(string sql, params DbParameter[] parameters);

        /// <summary>
        /// 执行查询读取器。
        /// </summary>
        /// <param name="sql">sql语句。</param>
        /// <param name="parameters">参数。</param>
        /// <returns>返回DbDataReader。</returns>
        public DbDataReader ExecuteReader(string sql, params DbParameter[] parameters);

        /// <summary>
        /// 执行查询并返回单个值。
        /// </summary>
        /// <param name="sql">sql语句。</param>
        /// <param name="parameters">参数。</param>
        /// <returns>返回对象。</returns>
        public object ExecuteScalar(string sql, params DbParameter[] parameters);

        /// <summary>
        /// 批量插入。
        /// </summary>
        /// <param name="datatable">数据库表。</param>
        /// <returns>返回执行是否成功。</returns>
        public bool BatchInsert(DataTable datatable);

        /// <summary>
        /// 获取数据库表第一条数据的sql。
        /// </summary>
        /// <param name="tableName">数据库表名字。</param>
        /// <returns>返回对应sql。</returns>
        public string GetOneDataByTableName(string tableName);

        /// <summary>
        /// 根据表名，站点id，排序字段名字获取数据库表第一条数据的sql。
        /// </summary>
        /// <param name="tableName">数据库表名字。</param>
        /// <param name="siteId">站点id。</param>
        /// <param name="orderName">排序字段名字。</param>
        /// <returns>返回对应sql。</returns>
        public string GetOneDataByTableNameAndSiteId(string tableName, int siteId, string orderName);

        /// <summary>
        /// 根据表名，站点id，排序字段名字获取数据库表全部数据的sql。
        /// </summary>
        /// <param name="tableName">数据库表名字。</param>
        /// <param name="siteId">站点id。</param>
        /// <param name="orderName">排序字段名字。</param>
        /// <returns>返回对应sql。</returns>
        public string GetAllDataByTableNameAndSiteId(string tableName, int siteId, string orderName);

        /// <summary>
        /// 根据表名，节点id，获取数据库表全部数据的sql。
        /// </summary>
        /// <param name="tableName">数据库表名字。</param>
        /// <param name="nodeId">节点id。</param>
        /// <returns>返回对应sql。</returns>
        public string GetAllDataByTableNameAndNodeId(string tableName, int nodeId);

        /// <summary>
        /// 根据表名，排序字段名字，获取数据库表第一条数据的sql。
        /// </summary>
        /// <param name="tableName">数据库表名字。</param>
        /// <param name="orderName">排序字段名字。</param>
        /// <returns>返回对应sql。</returns>
        public string GetOneDataByTableNameAndOrder(string tableName, string orderName);

        /// <summary>
        /// 根据站点Id，节点左值，节点右值，获取节点表的一级节点和二级节点的sql。
        /// </summary>
        /// <param name="siteId">站点Id。</param>
        /// <param name="left">节点左值。</param>
        /// <param name="right">节点右值。</param>
        /// <returns>返回对应sql。</returns>
        public string GetRootNodeIDAndMasterNodeID(int siteId, int left, int right);

        /// <summary>
        /// 根据站点Id，获取节点表的第一条Right的sql。
        /// </summary>
        /// <param name="siteId">站点Id。</param>
        /// <returns>返回对应sql。</returns>
        public string GetRightBySiteId(int siteId);

        /// <summary>
        /// 更新原节点的Left跟Right值。
        /// </summary>
        /// <param name="siteId">站点Id。</param>
        /// <param name="sourceNodeCount">源数据节点数量。</param>
        /// <param name="right">节点右值。</param>
        /// <param name="left">节点左值。</param>
        /// <param name="number">获取对应第几条sql。</param>
        /// <returns>返回对应sql。</returns>
        public string UpdateLeftAndRight(int siteId, int sourceNodeCount, int right, int left, int number = 0);
    }
}
