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; }

        private long freeID = 0;
        /// <summary>
        /// 每次获取，自动++
        /// </summary>
        public long FreeID
        {
            get
            {
                return freeID++;
            }
            set {
                freeID = value;
            }
        }
        private string ddl;
        public string DDL
        {
            get
            {
                if (ArrayFieldTypeInfos.Count() == 0)
                    return ddl;
                else
                    return SQLiteHelper.GetCreateTableCommandText(typeof(T), ArrayFieldTypeInfos.ToArray());
            }
        }

        public SQLiteHelper sqliteHelper;

        public DBTable()
        {
            TableName = SQLiteHelper.GetTableName(typeof(T));
            ddl = SQLiteHelper.GetCreateTableCommandText(typeof(T));
        }
        public void Init(SQLiteHelper sQLiteHelper)
        {
            sqliteHelper = sQLiteHelper;
        }

        public void Create()
        {
            sqliteHelper.ExecuteNonQuery(ddl);// 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()
        {

        }
    }
}
