using AutoMapper;
using OASystem.Domain;
using OASystem.Domain.AesEncryption;
using OASystem.Domain.Dtos.Resource;
using OASystem.Domain.Entities.Resource;
using OASystem.Domain.ViewModels.Resource;

namespace OASystem.Infrastructure.Repositories.Resource
{
    public class CarDataRepository: BaseRepository<Res_CarData, CarDataView>
    {
        private readonly IMapper _mapper;
        public CarDataRepository(SqlSugarClient sqlSugar, IMapper mapper) : base(sqlSugar)
        {
            _mapper = mapper;
        }

        /// <summary>
        /// 查询用车资料
        /// </summary>
        /// <param name="dto"></param>
        /// <returns></returns>
        public async Task<Result> QueryCarData(QueryCarDataDto dto)
        {
            string sqlWhere = string.Empty;
            if (!string.IsNullOrWhiteSpace(dto.UnitName)) sqlWhere += string.Format(@" And UnitName like '%{0}%'", AesEncryptionHelper.Encrypt(dto.UnitName));
            if (!string.IsNullOrWhiteSpace(dto.UnitArea) && dto.UnitArea != "全部") sqlWhere += string.Format(@" And UnitArea like '%{0}%'", AesEncryptionHelper.Encrypt(dto.UnitArea));
            if (!string.IsNullOrWhiteSpace(dto.Contact)) sqlWhere += string.Format(@" And Contact like '%{0}%'", AesEncryptionHelper.Encrypt(dto.Contact));
            if (!string.IsNullOrWhiteSpace(dto.ContactTel)) sqlWhere += string.Format(@" And ContactTel like '%{0}%'", AesEncryptionHelper.Encrypt(dto.ContactTel));

            sqlWhere += string.Format(@" And IsDel={0}", 0);
            if (!string.IsNullOrEmpty(sqlWhere.Trim()))
            {
                Regex r = new Regex("And");
                sqlWhere = r.Replace(sqlWhere, "Where", 1);
            }
            if (dto.PortType == 1)
            {
                string sql = string.Format(@"select * from Res_CarData {0}", sqlWhere);
                var carDataView = await _sqlSugar.SqlQueryable<Res_CarData>(sql).ToListAsync();
                if (carDataView.Count == 0) return  new Result() { Code = -1, Msg = "暂无数据" };

                carDataView = carDataView.OrderByDescending(x => x.CreateTime).ToList();

                var carDatas = _mapper.Map<List<CarDataView>>(carDataView);

                if (dto.PageSize == 0 && dto.PageIndex == 0)
                {
                    foreach (var item in carDatas) EncryptionProcessor.DecryptProperties(item);
                    return new Result()
                    {
                        Code = 0,
                        Msg = "查询成功",
                        Data = carDatas,
                    };
                }
                else
                {
                    int count = carDatas.Count;
                    float totalPage = (float)count / dto.PageSize;//总页数
                    if (totalPage == 0) totalPage = 1;
                    else totalPage = (int)Math.Ceiling((double)totalPage);

                    var ListData = new List<Res_CarData>();
                    for (int i = 0; i < dto.PageSize; i++)
                    {
                        var RowIndex = i + (dto.PageIndex - 1) * dto.PageSize;
                        if (RowIndex < carDatas.Count) {
                            EncryptionProcessor.DecryptProperties(carDatas[RowIndex]);
                            ListData.Add(carDatas[RowIndex]);
                        }
                        else break;
                    }

                    return new Result()
                    {
                        Code = 0,
                        Msg = "查询成功",
                        Data = new { pageCount = count, totalPage = (int)totalPage, pageIndex = dto.PageIndex, pageSize = dto.PageSize, pageSource = ListData },
                    };
                }
            }
            else if (dto.PortType == 2 || dto.PortType == 3)
            {
                string sql = string.Format(@"select * from Res_CarData {0}", sqlWhere);
                var carDatas = await _sqlSugar.SqlQueryable<Res_CarData>(sql).ToListAsync();
                if (carDatas.Count == 0) return new Result() { Code = -1, Msg = "暂无数据" };

                carDatas = carDatas.OrderByDescending(x => x.CreateTime).ToList();

                if (dto.PageSize == 0 || dto.PageIndex == 0)
                {
                    foreach (var item in carDatas) EncryptionProcessor.DecryptProperties(item);
                    return new Result()
                    {
                        Code = 0,
                        Msg = "查询成功",
                        Data = carDatas,
                    };
                }
                else
                {
                    int count = carDatas.Count;
                    float totalPage = (float)count / dto.PageSize;//总页数
                    if (totalPage == 0) totalPage = 1;
                    else totalPage = (int)Math.Ceiling((double)totalPage);

                    var ListData = new List<Res_CarData>();
                    for (int i = 0; i < dto.PageSize; i++)
                    {
                        var RowIndex = i + (dto.PageIndex - 1) * dto.PageSize;
                        if (RowIndex < carDatas.Count)
                        {
                            EncryptionProcessor.DecryptProperties(carDatas[RowIndex]);
                            ListData.Add(carDatas[RowIndex]);
                        }
                        else break;
                    }

                    return new Result()
                    {
                        Code = 0,
                        Msg = "查询成功",
                        Data = new { pageCount = count, totalPage = ((int)totalPage).ToString(), pageIndex = dto.PageIndex, pageSize = dto.PageSize, pageSource = ListData },
                    };
                }
            }
            else return new Result() { Code = -2, Msg = MsgTips.Port };
        }
    }
}