using OrmTest.Models;
using SqlSugar;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace OrmTest.UnitTest
{
    public class Mapping : UnitTestBase
    {
        private Mapping() { }
        public Mapping(int eachCount)
        {
            this.Count = eachCount;
        }

        public void Init()
        {

            var db = GetInstance();
            var t1 = db.Queryable<Student>().Where(it => it.Id == 1).ToSql();
            base.Check("SELECT [ID],[SchoolId],[Name],[CreateTime] FROM [STudent]  WHERE ( [ID] = @Id0 ) ", null, t1.Key, null, "Mapping t1 error");

            db.MappingColumns.Add("Id", "id", "School");
            var t2 = db.Queryable<Student, School>((st, sc) => new object[] {
                JoinType.Left,st.SchoolId==sc.Id
            })
            .Where(st => st.Id == 1)
            .Where((st, sc) => sc.Id == 1)
            .Where((st, sc) => sc.Id == st.Id)
            .GroupBy(st => st.Id)
            .GroupBy((st, sc) => sc.Id).OrderBy(st => st.Id, OrderByType.Asc)
            .Select((st, sc) => new { stid = st.Id, scid = sc.Id }).ToSql();
            base.Check(@"SELECT  [st].[ID] AS [stid] , [sc].[id] AS [scid]  FROM [STudent] st Left JOIN [School] sc ON ( [st].[SchoolId] = [sc].[id] )   WHERE ( [st].[ID] = @Id0 )  AND ( [sc].[id] = @Id1 )  AND ( [sc].[id] = [st].[ID] )GROUP BY [st].[ID],[sc].[id] ORDER BY [st].[ID] ASC ",
                null, t2.Key, null, " Mapping t2 error");
            var x2 = GetInstance();

            var q = x2.Queryable<Student>().AS("t");
            var t3 = q.ToSql();
            var t4 = q.ToSql();
            base.Check("SELECT [ID],[SchoolId],[Name],[CreateTime] FROM [t] ", null, t3.Key, null, "Mapping t3 error");
            base.Check("SELECT [ID],[SchoolId],[Name],[CreateTime] FROM [t] ", null, t4.Key, null, "Mapping t3 error");

            var x3 = GetInstance2();
            x3.MappingTables.Add("Student", "studenT");
            int count = 0;
            var t5 = x3.Queryable<Student>().ToPageList(1,2,ref count);
        }

        public new SqlSugarClient GetInstance()
        {
            SqlSugarClient db = new SqlSugarClient(new ConnectionConfig() { InitKeyType = InitKeyType.Attribute, ConnectionString = Config.ConnectionString, DbType = DbType.SqlServer, IsAutoCloseConnection = true });
            return db;
        }
        public  SqlSugarClient GetInstance2()
        {
            SqlSugarClient db = new SqlSugarClient(new ConnectionConfig() { InitKeyType = InitKeyType.Attribute, ConnectionString = Config.ConnectionString, DbType = DbType.SqlServer, IsAutoCloseConnection = true });
            db.Ado.IsEnableLogEvent = true;
            db.Ado.LogEventStarting = (sql, pars) =>
            {
                Console.WriteLine(sql + "\r\n" + db.Utilities.SerializeObject(pars));
                Console.WriteLine();
            };
            return db;
        }
    }
}