using System;
using System.Collections.Generic;
using System.Data;
using System.Diagnostics;
using AutoMapper.Data;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using SQLite;

namespace UnitTestProject1
{
    [TestClass]
    public class UnitTestSQLiteHelper
    {
        [TestMethod]
        public void TestMethodSave()
        {
            Exception ex = null;
            try
            {
                var assemblies = System.AppDomain.CurrentDomain.GetAssemblies();
                var cfg = new AutoMapper.Configuration.MapperConfigurationExpression();
                cfg.AddProfiles("UnitTestProject1");
                AutoMapper.Mapper.Initialize(cfg);

                Model.DBModel dBModel = new Model.DBModel("test.sqlite3");
                dBModel.Init();

                var books_db = new List<Model.Book>
            {
                new Model.Book()
                {
                    ID = dBModel.Books.FreeID,
                    BookName = "ASP.NET MVC 5 高级编程(第5版)",
                    PageCount = 460,
                    PrintTime = new DateTime(2019,8,8)
                },
                new Model.Book()
                {
                    ID = dBModel.Books.FreeID,
                    BookName = "c# 入门经典(第7版)",
                    PageCount = 432,
                    PrintTime = new DateTime(2012,5,20)
                },
            };
                var users_lc = new List<Model.UserLC>
            {
                new Model.UserLC(){
                    ID =  dBModel.Users.FreeID,
                    Name = "潘栩锋",
                    BookIDs = new List<long>{
                        books_db[0].ID,books_db[1].ID
                    }
                }
            };
                var users_db = AutoMapper.Mapper.Map<List<Model.User>>(users_lc);

                List<string> sqls = new List<string>();
                foreach (var book_db in books_db)
                    sqls.Add(SQLiteHelper.GetInsertCommandText(book_db));

                foreach (var user_db in users_db)
                    sqls.Add(SQLiteHelper.GetInsertCommandText(user_db));

                dBModel.sqliteHelper.QueryTranAsync(sqls);
            }
            catch (Exception e)
            {
                ex = e;
            }
            Assert.IsNull(ex);
        }

        [TestMethod]
        public void TestMethodLoad()
        {
            Exception ex = null;
            try
            {
                var assemblies = System.AppDomain.CurrentDomain.GetAssemblies();
                var cfg = new AutoMapper.Configuration.MapperConfigurationExpression();
                cfg.AddDataReaderMapping();
                cfg.AddProfiles("UnitTestProject1");
                AutoMapper.Mapper.Initialize(cfg);

                Model.DBModel dBModel = new Model.DBModel("test.sqlite3");
                dBModel.Init();

                string sql =
                    $"SELECT * FROM {dBModel.Users.TableName}" +
                    $" ORDER BY ID";
                var table = dBModel.sqliteHelper.ExecuteReader(sql);
                Stopwatch stopwatch = new Stopwatch();

                stopwatch.Start();
                var users_db = SQLiteHelper.ToObjs<Model.User>(table);
                stopwatch.Stop();
                Console.WriteLine($"SQLiteHelper.ToObjs<Model.User>(table) Elapsed={stopwatch.ElapsedMilliseconds}ms");

                stopwatch.Restart();
                var users_db2 = AutoMapper.Mapper.Map<IDataReader, List<Model.User>>(table.CreateDataReader());
                stopwatch.Stop();
                Console.WriteLine($"AutoMapper.Mapper.Map<IDataReader,List<Model.User>>(table.CreateDataReader()) Elapsed={stopwatch.ElapsedMilliseconds}ms");

                var users_lc = AutoMapper.Mapper.Map<List<Model.UserLC>>(users_db);


                sql =
                    $"SELECT * FROM {dBModel.Books.TableName}" +
                    $" ORDER BY ID";
                table = dBModel.sqliteHelper.ExecuteReader(sql);

                stopwatch.Restart();
                var books_db = SQLiteHelper.ToObjs<Model.Book>(table);
                stopwatch.Stop();
                Console.WriteLine($"SQLiteHelper.ToObjs<Model.Book>(table) Elapsed={stopwatch.ElapsedMilliseconds}ms");

                stopwatch.Restart();
                var books_db2 = AutoMapper.Mapper.Map<IDataReader, List<Model.Book2>>(table.CreateDataReader());
                stopwatch.Stop();
                Console.WriteLine($"AutoMapper.Mapper.Map<IDataReader, List<Model.Book2>>(table.CreateDataReader()) Elapsed={stopwatch.ElapsedMilliseconds}ms");

                string json = Newtonsoft.Json.JsonConvert.SerializeObject(books_db, Newtonsoft.Json.Formatting.Indented);
                Console.WriteLine(json);

            }
            catch (Exception e)
            {

                ex = e;
                Assert.Fail(e.Message);
            }
            Assert.IsNull(ex);
        }

        
    }
}