using System;
using System.Collections.Generic;
using System.Data;
using System.Data.Common;

using System.Data.SqlClient;
using System.Text;
using CB.Common;
using CB.Data;
using CB.Entity;
using CB.Interface.Infrastructure;


namespace CB.Data.SqlServer
{
    public class TCQXCManage : Repository<TCQXCInfo>, ITCQXCService
    {
        public TCQXCManage(string interfaceId)
            : base(interfaceId)
        {
        }
        public override bool Save(TCQXCInfo entity)
        {
            DbParameter[] pars ={
                DbHelper.MakeInParam(InterfaceId,"@Term",(DbType)SqlDbType.Int,4,entity.Term),
                DbHelper.MakeInParam(InterfaceId,"@OpenCode1",(DbType)SqlDbType.Int,4,entity.OpenCode1),
                DbHelper.MakeInParam(InterfaceId,"@OpenCode2",(DbType)SqlDbType.Int,4,entity.OpenCode2),
                DbHelper.MakeInParam(InterfaceId,"@OpenCode3",(DbType)SqlDbType.Int,4,entity.OpenCode3),
                DbHelper.MakeInParam(InterfaceId,"@OpenCode4",(DbType)SqlDbType.Int,4,entity.OpenCode4),
                DbHelper.MakeInParam(InterfaceId,"@OpenCode5",(DbType)SqlDbType.Int,4,entity.OpenCode5),
                DbHelper.MakeInParam(InterfaceId,"@OpenCode6",(DbType)SqlDbType.Int,4,entity.OpenCode6),
                DbHelper.MakeInParam(InterfaceId,"@OpenCode7",(DbType)SqlDbType.Int,4,entity.OpenCode7),
                DbHelper.MakeInParam(InterfaceId,"@OpenTime",(DbType)SqlDbType.DateTime,0,entity.OpenTime),
                DbHelper.MakeInParam(InterfaceId,"@ShiJiHao",(DbType)SqlDbType.NVarChar,0,entity.ShiJiHao),
                DbHelper.MakeInParam(InterfaceId,"@KaiJiHao",(DbType)SqlDbType.NVarChar,0,entity.KaiJiHao),
                DbHelper.MakeInParam(InterfaceId,"@Detail",(DbType)SqlDbType.NVarChar,500,entity.Detail)
                                };
            return TypeConverter.ObjectToInt(DbHelper.ExecuteScalar(InterfaceId,CommandType.StoredProcedure, "usp_TCQXC_save", pars)) > 0;
        }

        public override bool Update(TCQXCInfo entity)
        {
            DbParameter[] pars ={
                DbHelper.MakeInParam(InterfaceId,"@Term",(DbType)SqlDbType.Int,4,entity.Term),
                DbHelper.MakeInParam(InterfaceId,"@OpenCode1",(DbType)SqlDbType.Int,4,entity.OpenCode1),
                DbHelper.MakeInParam(InterfaceId,"@OpenCode2",(DbType)SqlDbType.Int,4,entity.OpenCode2),
                DbHelper.MakeInParam(InterfaceId,"@OpenCode3",(DbType)SqlDbType.Int,4,entity.OpenCode3),
                DbHelper.MakeInParam(InterfaceId,"@OpenCode4",(DbType)SqlDbType.Int,4,entity.OpenCode4),
                DbHelper.MakeInParam(InterfaceId,"@OpenCode5",(DbType)SqlDbType.Int,4,entity.OpenCode5),
                DbHelper.MakeInParam(InterfaceId,"@OpenCode6",(DbType)SqlDbType.Int,4,entity.OpenCode6),
                DbHelper.MakeInParam(InterfaceId,"@OpenCode7",(DbType)SqlDbType.Int,4,entity.OpenCode7),
                DbHelper.MakeInParam(InterfaceId,"@OpenTime",(DbType)SqlDbType.DateTime,0,entity.OpenTime),
                DbHelper.MakeInParam(InterfaceId,"@ShiJiHao",(DbType)SqlDbType.NVarChar,0,entity.ShiJiHao),
                DbHelper.MakeInParam(InterfaceId,"@KaiJiHao",(DbType)SqlDbType.NVarChar,0,entity.KaiJiHao),
                DbHelper.MakeInParam(InterfaceId,"@Detail",(DbType)SqlDbType.NVarChar,500,entity.Detail)
                                };
            return TypeConverter.ObjectToInt(DbHelper.ExecuteScalar(InterfaceId, CommandType.StoredProcedure, "usp_TCQXC_save", pars)) > 0;
        }

        public override bool Delete(int id)
        {
            DbParameter[] pars ={
                 DbHelper.MakeInParam(InterfaceId,"@Id",(DbType)SqlDbType.Int,4,id)
                                };
            return TypeConverter.ObjectToInt(DbHelper.ExecuteScalar(InterfaceId,CommandType.StoredProcedure, "usp_TCQXC_Delete", pars)) > 0;
        }

        public override TCQXCInfo Get<TKey>(TKey key)
        {
            TCQXCInfo Entity = null;
            DbParameter[] para = 
            {
                DbHelper.MakeInParam(InterfaceId,"@Id",(DbType)SqlDbType.Int,4,key)
            };
            using (IDataReader reader = DbHelper.ExecuteReader(InterfaceId,CommandType.Text,
                @"SELECT TOP 1 [Id],[Term],[OpenCode1],[OpenCode2],[OpenCode3],[OpenCode4],[OpenCode5],
[OpenCode6],[OpenCode7],[OpenTime],[ShiJiHao],[KaiJiHao],[Detail],[Addtime] FROM [DT_TCQXC] WHERE [Id]= @Id",
                para))
            {
                if (reader.Read())
                {
                    Entity = LoadEntity(reader);
                }
                reader.Dispose();
            }
            return Entity;
        }

        public override IList<TCQXCInfo> ToList()
        {
            IList<TCQXCInfo> list = new List<TCQXCInfo>();

            using (DataTable dt = DbHelper.ExecuteDatatable(InterfaceId, @"SELECT [Id],[Term],[OpenCode1],[OpenCode2],[OpenCode3],[OpenCode4],[OpenCode5],
[OpenCode6],[OpenCode7],[OpenTime],[ShiJiHao],[KaiJiHao],[Detail],[Addtime] FROM [DT_TCQXC] ORDER BY [Term] ASC"))
            {
                if (null != dt && 0 < dt.Rows.Count)
                {
                    foreach (DataRow dr in dt.Rows)
                    {
                        list.Add(LoadEntity(dr));
                    }
                }
                dt.Dispose();
            }
            return list;
        }

        public override IList<TCQXCInfo> ToList(TCQXCInfo entity)
        {
            throw new NotImplementedException();
        }

        public override IList<TCQXCInfo> ToPaging(TCQXCInfo entity, int pageSize, int pageIndex, out int recordCount)
        {
            string where = "1=1 ";
            if (null != entity)
            {
                if (entity.Term > 0)
                    where += " AND [Term]=" + entity.Term;
            }
            recordCount = 0;
            string field = "[Id],[Term],[OpenCode1],[OpenCode2],[OpenCode3],[OpenCode4],[OpenCode5],[OpenCode6],[OpenCode7],[OpenTime],[ShiJiHao],[KaiJiHao],[Detail],[Addtime]"
                , orderField = "[Term] DESC"
                , tableName = "DT_TCQXC";
            DbParameter[] para = 
            {
                DbHelper.MakeInParam(InterfaceId,"@pageSize",(DbType)SqlDbType.Int,4,pageSize),
                DbHelper.MakeInParam(InterfaceId,"@page",(DbType)SqlDbType.Int,4,pageIndex),
                DbHelper.MakeInParam(InterfaceId,"@tableName",(DbType)SqlDbType.NVarChar,500,tableName),
                DbHelper.MakeInParam(InterfaceId,"@field",(DbType)SqlDbType.NVarChar,1000,field),
                DbHelper.MakeInParam(InterfaceId,"@orderField",(DbType)SqlDbType.NVarChar,50,orderField),
                DbHelper.MakeInParam(InterfaceId,"@where",(DbType)SqlDbType.NVarChar,2000,where)
            };
            IList<TCQXCInfo> list = new List<TCQXCInfo>();
            using (IDataReader reader = DbHelper.ExecuteReader(InterfaceId,CommandType.StoredProcedure, "usp_st_page", para))
            {
                while (reader.Read())
                {
                    list.Add(LoadEntity(reader));
                }
                if (reader.NextResult() && reader.Read())
                {
                    recordCount = reader.GetInt32(0);
                }
                reader.Dispose();
            }
            return list;
        }

        protected override TCQXCInfo LoadEntity(DataRow dr)
        {
            TCQXCInfo entity = new TCQXCInfo
            {
                Id = TypeConverter.ObjectToInt(dr["Id"]),
                Term = TypeConverter.ObjectToInt(dr["Term"]),
                OpenCode1 = TypeConverter.ObjectToInt(dr["OpenCode1"]),
                OpenCode2 = TypeConverter.ObjectToInt(dr["OpenCode2"]),
                OpenCode3 = TypeConverter.ObjectToInt(dr["OpenCode3"]),
                OpenCode4 = TypeConverter.ObjectToInt(dr["OpenCode4"]),
                OpenCode5 = TypeConverter.ObjectToInt(dr["OpenCode5"]),
                OpenCode6 = TypeConverter.ObjectToInt(dr["OpenCode6"]),
                OpenCode7 = TypeConverter.ObjectToInt(dr["OpenCode7"]),
                OpenTime = TypeConverter.ObjectToDateTime(dr["OpenTime"], DateTime.MinValue),
                ShiJiHao = dr["ShiJiHao"].ToString().Trim(),
                KaiJiHao = dr["KaiJiHao"].ToString().Trim(),
                Detail = dr["Detail"].ToString(),
                Addtime = TypeConverter.ObjectToDateTime(dr["Addtime"], DateTime.MinValue)
            };
            entity.OpenCode = new List<int>() { entity.OpenCode1, entity.OpenCode2, entity.OpenCode3, entity.OpenCode4, entity.OpenCode5, entity.OpenCode6, entity.OpenCode7 };
            return entity;
        }

        protected override TCQXCInfo LoadEntity(IDataReader reader)
        {
            TCQXCInfo entity = new TCQXCInfo
            {
                Id = TypeConverter.ObjectToInt(reader["Id"]),
                Term = TypeConverter.ObjectToInt(reader["Term"]),
                OpenCode1 = TypeConverter.ObjectToInt(reader["OpenCode1"]),
                OpenCode2 = TypeConverter.ObjectToInt(reader["OpenCode2"]),
                OpenCode3 = TypeConverter.ObjectToInt(reader["OpenCode3"]),
                OpenCode4 = TypeConverter.ObjectToInt(reader["OpenCode4"]),
                OpenCode5 = TypeConverter.ObjectToInt(reader["OpenCode5"]),
                OpenCode6 = TypeConverter.ObjectToInt(reader["OpenCode6"]),
                OpenCode7 = TypeConverter.ObjectToInt(reader["OpenCode7"]),
                OpenTime = TypeConverter.ObjectToDateTime(reader["OpenTime"], DateTime.MinValue),
                ShiJiHao = reader["ShiJiHao"].ToString().Trim(),
                KaiJiHao = reader["KaiJiHao"].ToString().Trim(),
                Detail = reader["Detail"].ToString(),
                Addtime = TypeConverter.ObjectToDateTime(reader["Addtime"], DateTime.MinValue)
            };
            entity.OpenCode = new List<int>() { entity.OpenCode1, entity.OpenCode2, entity.OpenCode3, entity.OpenCode4, entity.OpenCode5, entity.OpenCode6, entity.OpenCode7 };
            return entity;
        }

        public IList<TCQXCInfo> ToListForTrend(long term, LotterySearchField fields)
        {
            IList<TCQXCInfo> list = new List<TCQXCInfo>();
            DbParameter[] para = 
            {
                DbHelper.MakeInParam(InterfaceId,"@statement",(DbType)SqlDbType.NVarChar,0,"SELECT TOP 2 OpenTime, ShiJiHao, KaiJiHao, Term, OpenCode1, OpenCode2, OpenCode3, OpenCode4, OpenCode5, OpenCode6, OpenCode7  FROM DT_TCQXC WHERE [Term]<=@qi ORDER BY [Term] DESC"),
                DbHelper.MakeInParam(InterfaceId,"@params",(DbType)SqlDbType.NVarChar,10,"@qi int"),
                DbHelper.MakeInParam(InterfaceId,"@qi",(DbType)SqlDbType.Int,4,term)
            };
            using (IDataReader reader = DbHelper.ExecuteReader(InterfaceId,CommandType.StoredProcedure, "dbo.sp_executesql", para))
            {
                while (reader.Read())
                {
                    var entity = new TCQXCInfo
                    {
                        Term = TypeConverter.ObjectToInt(reader["Term"]),
                        OpenCode1 = TypeConverter.ObjectToInt(reader["OpenCode1"]),
                        OpenCode2 = TypeConverter.ObjectToInt(reader["OpenCode2"]),
                        OpenCode3 = TypeConverter.ObjectToInt(reader["OpenCode3"]),
                        OpenCode4 = TypeConverter.ObjectToInt(reader["OpenCode4"]),
                        OpenCode5 = TypeConverter.ObjectToInt(reader["OpenCode5"]),
                        OpenCode6 = TypeConverter.ObjectToInt(reader["OpenCode6"]),
                        OpenCode7 = TypeConverter.ObjectToInt(reader["OpenCode7"]),
                        OpenTime = TypeConverter.ObjectToDateTime(reader["OpenTime"], DateTime.MinValue),
                        ShiJiHao = reader["ShiJiHao"].ToString().Trim(),
                        KaiJiHao = reader["KaiJiHao"].ToString().Trim()
                    };
                    entity.OpenCode = new List<int>() { entity.OpenCode1, entity.OpenCode2, entity.OpenCode3, entity.OpenCode4, entity.OpenCode5, entity.OpenCode6, entity.OpenCode7 };
                    list.Add(entity);
                }
                reader.Dispose();
            }
            return list;
        }

        public IList<TCQXCInfo> GetListToEnd(long term, LotterySearchField fields)
        {
            IList<TCQXCInfo> list = new List<TCQXCInfo>();
            DbParameter[] para = 
            {
                DbHelper.MakeInParam(InterfaceId,"@statement",(DbType)SqlDbType.NVarChar,200,"SELECT OpenTime, ShiJiHao, KaiJiHao, Term, OpenCode1, OpenCode2, OpenCode3, OpenCode4, OpenCode5, OpenCode6, OpenCode7  FROM DT_TCQXC  WHERE [Term]>=@qi ORDER BY [Term] ASC"),
                DbHelper.MakeInParam(InterfaceId,"@params",(DbType)SqlDbType.NVarChar,10,"@qi int"),
                DbHelper.MakeInParam(InterfaceId,"@qi",(DbType)SqlDbType.Int,4,term)
            };
            using (DataTable dt = DbHelper.ExecuteDatatable(InterfaceId,CommandType.StoredProcedure, "dbo.sp_executesql", para))
            {
                if (null != dt && 0 < dt.Rows.Count)
                {
                    foreach (DataRow dr in dt.Rows)
                    {
                        var entity = new TCQXCInfo
                        {
                            Term = TypeConverter.ObjectToInt(dr["Term"]),
                            OpenCode1 = TypeConverter.ObjectToInt(dr["OpenCode1"]),
                            OpenCode2 = TypeConverter.ObjectToInt(dr["OpenCode2"]),
                            OpenCode3 = TypeConverter.ObjectToInt(dr["OpenCode3"]),
                            OpenCode4 = TypeConverter.ObjectToInt(dr["OpenCode4"]),
                            OpenCode5 = TypeConverter.ObjectToInt(dr["OpenCode5"]),
                            OpenCode6 = TypeConverter.ObjectToInt(dr["OpenCode6"]),
                            OpenCode7 = TypeConverter.ObjectToInt(dr["OpenCode7"]),
                            OpenTime = TypeConverter.ObjectToDateTime(dr["OpenTime"], DateTime.MinValue),
                            ShiJiHao = dr["ShiJiHao"].ToString().Trim(),
                            KaiJiHao = dr["KaiJiHao"].ToString().Trim()
                        };
                        entity.OpenCode = new List<int>() { entity.OpenCode1, entity.OpenCode2, entity.OpenCode3, entity.OpenCode4, entity.OpenCode5, entity.OpenCode6, entity.OpenCode7 };
                        list.Add(entity);
                    }
                }
                dt.Dispose();
            }
            return list;
        }
    }
}