using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Text;

namespace SQLite
{
    public class DBTable<T> : IDBTable
        where T : new()
    {
        public List<SQLiteHelper.ArrayFieldTypeInfo> ArrayFieldTypeInfos = new List<SQLiteHelper.ArrayFieldTypeInfo>();

        public string TableName { get; private set; }
        public string DDL
        {
            get
            {
                return SQLiteHelper.GetCreateTableCommandText(typeof(T), ArrayFieldTypeInfos.ToArray());
            }
        }

        SQLiteHelper sqliteHelper;

        public DBTable()
        {
            TableName = SQLiteHelper.GetTableName(typeof(T));

        }
        public void Init(string connectionString)
        {
            sqliteHelper = new SQLiteHelper
            {
                ConnectionString = connectionString
            };
        }

        public void Create()
        {
            sqliteHelper.ExecuteNonQuery(SQLiteHelper.GetCreateTableCommandText(typeof(T), ArrayFieldTypeInfos.ToArray()));
        }

        public void Add(T t)
        {
            sqliteHelper.ExecuteNonQuery(SQLiteHelper.GetInsertCommandText(t));
        }
        public void Update(T t, string condition)
        {
            sqliteHelper.ExecuteNonQuery(SQLiteHelper.GetUpdateCommandText(t, condition));
        }
        public bool AddRange(IEnumerable<T> array)
        {
            List<string> querys = new List<string>();
            foreach (T t in array)
            {
                querys.Add(SQLiteHelper.GetInsertCommandText(t));
            }
            return sqliteHelper.QueryTran(querys);
        }

        public List<T> Find(string condition)
        {
            string sql = $"SELECT * FROM {TableName}";
            if (!string.IsNullOrEmpty(condition))
                sql += " " + condition;

            DataTable dataTable = sqliteHelper.ExecuteReader(sql);
            return SQLiteHelper.ToObjs<T>(dataTable, ArrayFieldTypeInfos.ToArray());
        }

        /// <summary>
        /// 获取最后N行数据
        /// </summary>
        /// <param name="count"></param>
        /// <returns></returns>
        public List<T> Last(int count)
        {
            return Find($"LIMIT (SELECT COUNT()-{count} FROM {TableName}),{count}");
        }

        /// <summary>
        /// 获取前面N行数据
        /// </summary>
        /// <param name="count"></param>
        /// <returns></returns>
        public List<T> First(int count)
        {
            return Find($"LIMIT {count}");
        }

        public void Remove()
        {

        }
    }
}
