using AutoMapper;
using EyeSoft.Collections.Generic;
using Newtonsoft.Json;
using OASystem.Domain;
using OASystem.Domain.Dtos.Groups;
using OASystem.Domain.Entities.Groups;
using OASystem.Domain.ViewModels.Groups;
using Org.BouncyCastle.Ocsp;
using Org.BouncyCastle.Utilities;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace OASystem.Infrastructure.Repositories.Groups
{
    /// <summary>
    /// 团组下单前信息
    /// </summary>
    public class GroupOrderPreInfoRepository : BaseRepository<Grp_OrderPreInfo, OrderPreInfoView>
    {
        private readonly IMapper _mapper;
        private readonly DelegationInfoRepository _groupInfoRep;
        public GroupOrderPreInfoRepository(SqlSugarClient sqlSugar, IMapper mapper, DelegationInfoRepository groupInfoRep) : base(sqlSugar)
        {
            _mapper = mapper;
            _groupInfoRep = groupInfoRep;
        }

        /// <summary>
        /// 获取基础信息
        /// </summary>
        /// <param name="tempId"></param>
        /// <returns></returns>
        public async Task<JsonView> DataInit(int userId)
        {
            var jw = new JsonView() { Code = StatusCodes.Status200OK, Msg = "操作成功!" };

            // 获取团组名称列表(端口类型为1)
            var groupNames = await _groupInfoRep.GetGroupNameList(new Domain.Dtos.Groups.GroupNameDto() { PortType = 1 });

            var tempDatas = await _sqlSugar.Queryable<Sys_SetData>()
                .Where(x => x.IsDel == 0 && x.STid == 109)
                .Select(x => new { x.Id, x.Name })
                .ToListAsync();

            var names = await _sqlSugar.Queryable<Grp_OrderPreInfo>()
                .Where(x => x.IsDel == 0 && x.CreateUserId == userId)
                .OrderByDescending(x => x.Id)
                .Select(x => new { x.Id, x.Name })
                .ToListAsync();

            jw.Data = new
            {
                groupNames = groupNames,
                tempDatas = tempDatas,
                names = names
            };
            return jw;
        }

        /// <summary>
        /// 获取模板信息
        /// </summary>
        /// <param name="tempId">模板编号,默认 1404</param>
        /// <returns></returns>
        public async Task<GrpOrderPreItemView[]> TempInfoById(int tempId = 1404)
        {
            var tempInfos = await _sqlSugar.Queryable<Sys_FormTemp, Sys_SetData, Sys_SetData>((ft, sd1, sd2) =>
                new JoinQueryInfos(
                    JoinType.Left, ft.FieldNameId == sd1.Id,
                    JoinType.Left, ft.FieldTypeId == sd2.Id
                    ))
                .Where((ft, sd1, sd2) => ft.IsDel == 0 && ft.TempId == tempId)
                .OrderBy((ft, sd1, sd2) => ft.Index)
                .Select((ft, sd1, sd2) => new GrpOrderPreItemView()
                {
                    FieldTempId = ft.Id,
                    FieldName = sd1.Name,
                    OriginVal = "-",
                   // FieldTypeName = !string.IsNullOrEmpty(ft.Remark) ? sd2.Name +"-"+ ft.Remark : sd2.Name,
                    FieldTypeName =  sd2.Name,
                    IsRequired = ft.IsRequired,
                    IsRemark = ft.IsRemark,
                    Index = ft.Index
                })
                .ToArrayAsync();
            return tempInfos;
        }

        /// <summary>
        /// 获取模板信息
        /// </summary>
        /// <param name="tempId">模板编号,默认 1404</param>
        /// <returns></returns>
        public async Task<GrpOrderPreItemMobileView[]> TempMobileInfoById(int tempId = 1404)
        {
            var tempInfos = await _sqlSugar.Queryable<Sys_FormTemp, Sys_SetData, Sys_SetData>((ft, sd1, sd2) =>
                new JoinQueryInfos(
                    JoinType.Left, ft.FieldNameId == sd1.Id,
                    JoinType.Left, ft.FieldTypeId == sd2.Id
                    ))
                .Where((ft, sd1, sd2) => ft.IsDel == 0 && ft.TempId == tempId)
                .OrderBy((ft, sd1, sd2) => ft.Index)
                .Select((ft, sd1, sd2) => new GrpOrderPreItemMobileView()
                {
                    FieldTempId = ft.Id,
                    FieldName = sd1.Name,
                    OriginVal = "-",
                    // FieldTypeName = !string.IsNullOrEmpty(ft.Remark) ? sd2.Name +"-"+ ft.Remark : sd2.Name,
                    FieldTypeName = sd2.Name,
                    IsRequired = ft.IsRequired,
                    IsRemark = ft.IsRemark,
                    Index = ft.Index
                })
                .ToArrayAsync();
            return tempInfos;
        }

        /// <summary>
        /// 获取团组下单前信息
        /// </summary>
        /// <param name="id">下单前信息Id</param>
        /// <param name="tempId">模板编号,默认 1404</param>
        /// <param name="portType">端口号</param>
        /// <returns></returns>
        public async Task<JsonView> InfoAsync(int id, int tempId = 1404)
        {
            var jw = new JsonView() { Code = StatusCodes.Status200OK, Msg = "操作成功!" };
            var view = new GrpOrderPreInfoView();
            var info = await _sqlSugar.Queryable<Grp_OrderPreInfo>()
                .FirstAsync(x => x.IsDel == 0 && x.Id == id);

            var temps = await TempInfoById(tempId);
            if (info == null)
            {
                view.Items = temps; 
                jw.Data = view;
                return jw;
            }

            view.Id = id;
            view.Name = info.Name;
            view.GroupId = info.GroupId;
            var items = await _sqlSugar.Queryable<Sys_FormTemp, Grp_OrderPreItem, Sys_SetData, Sys_SetData>((ft, opi, sd1, sd2) =>
                new JoinQueryInfos(
                    JoinType.Inner, ft.Id == opi.FormTempId,
                    JoinType.Left, ft.FieldNameId == sd1.Id,
                    JoinType.Left, ft.FieldTypeId == sd2.Id
                    ))
                .Where((ft, opi, sd1, sd2) => ft.IsDel == 0 && opi.IsDel == 0 && opi.ParentId == id && ft.TempId == tempId)
                .OrderBy((ft, opi, sd1, sd2) => ft.Index)
                .Select((ft, opi, sd1, sd2) => new GrpOrderPreItemView()
                {
                    Id = opi.Id,
                    ParentId = opi.ParentId,
                    FieldTempId = ft.Id,
                    FieldName = sd1.Name,
                    FieldTypeName = sd2.Name,
                    OriginVal = opi.Value,
                    Remark = opi.Remark,
                    IsRequired = ft.IsRequired,
                    IsRemark = ft.IsRemark,
                    Index = ft.Index
                })
                .ToArrayAsync();

            // 如果原始数据不存在或者数量不匹配,则补充模板中缺失的字段
            if (!items.Any())
            {
                view.Items = temps;
            }
            else
            {
                var itemsList = items.ToList();
                foreach (var temp in temps)
                {
                    if (!itemsList.Any(x => x.FieldName.Equals(temp.FieldName)))
                    {
                        itemsList.Add(temp);
                    }
                }
                view.Items = itemsList.OrderBy(x => x.Index).ToArray();
            }

            jw.Data = view;
            return jw;
        }

        /// <summary>
        /// 获取团组下单前信息
        /// </summary>
        /// <param name="id">下单前信息Id</param>
        /// <param name="tempId">模板编号,默认 1404</param>
        /// <param name="portType">端口号</param>
        /// <returns></returns>
        public async Task<JsonView> MobileInfoAsync(int id, int tempId = 1404)
        {
            var jw = new JsonView() { Code = StatusCodes.Status200OK, Msg = "操作成功!" };
            var view = new GrpOrderPreInfoMobileView();
            var info = await _sqlSugar.Queryable<Grp_OrderPreInfo>()
                .FirstAsync(x => x.IsDel == 0 && x.Id == id);

            var temps = await TempMobileInfoById(tempId);
            if (info == null)
            {
                view.Items = temps;
                jw.Data = view;
                return jw;
            }

            view.Id = id;
            view.Name = info.Name;
            view.GroupId = info.GroupId;
            if (info.GroupId > 0)
            {
                var groupInfo = await _sqlSugar.Queryable<Grp_DelegationInfo>().FirstAsync(x => x.IsDel == 0 && x.Id == info.GroupId);
                if (groupInfo != null)
                {
                    view.GroupId = groupInfo.Id;
                    view.GroupName = groupInfo.TeamName;
                }
            }
            var items = await _sqlSugar.Queryable<Sys_FormTemp, Grp_OrderPreItem, Sys_SetData, Sys_SetData>((ft, opi, sd1, sd2) =>
                new JoinQueryInfos(
                    JoinType.Inner, ft.Id == opi.FormTempId,
                    JoinType.Left, ft.FieldNameId == sd1.Id,
                    JoinType.Left, ft.FieldTypeId == sd2.Id
                    ))
                .Where((ft, opi, sd1, sd2) => ft.IsDel == 0 && opi.IsDel == 0 && opi.ParentId == id && ft.TempId == tempId)
                .OrderBy((ft, opi, sd1, sd2) => ft.Index)
                .Select((ft, opi, sd1, sd2) => new GrpOrderPreItemMobileView()
                {
                    Id = opi.Id,
                    ParentId = opi.ParentId,
                    FieldTempId = ft.Id,
                    FieldName = sd1.Name,
                    FieldTypeName = sd2.Name,
                    OriginVal = opi.Value,
                    Remark = opi.Remark,
                    IsRequired = ft.IsRequired,
                    IsRemark = ft.IsRemark,
                    Index = ft.Index
                })
                .ToArrayAsync();

            // 如果原始数据不存在或者数量不匹配,则补充模板中缺失的字段
            if (!items.Any())
            {
                view.Items = temps;
            }
            else
            {
                var itemsList = items.ToList();
                foreach (var temp in temps)
                {
                    if (!itemsList.Any(x => x.FieldName.Equals(temp.FieldName)))
                    {
                        itemsList.Add(temp);
                    }
                }
                view.Items = itemsList.OrderBy(x => x.Index).ToArray();
            }

            jw.Data = view;
            return jw;
        }

        /// <summary>
        /// 获取团组下单前信息 op
        /// </summary>
        /// <param name="dto"></param>
        /// <returns></returns>
        public async Task<JsonView> OpAsync(GroupOrderPreInfoOpDto dto)
        {
            int dataId = dto.Id;
            var jw = new JsonView() { Code = StatusCodes.Status400BadRequest, Msg = "操作成功!" };
            int currUserId = dto.CurrUserId;
            if (currUserId < 1)
            {
                jw.Msg = MsgTips.UserId;
                return jw;
            }
            if (string.IsNullOrEmpty(dto.Name))
            {
                jw.Msg = $"名称不能为空!";
                return jw;
            }

            var info = new Grp_OrderPreInfo()
            {
                Id = dataId,
                Name = dto.Name,
                GroupId = dto.GroupId,
                CreateUserId = currUserId
            };

            var items = new List<Grp_OrderPreItem>();
            // 处理每一项信息
            foreach (var item in dto.Items)
            {
                var val = "";
                // 如果新值为 string[] 时,序列化为 JSON 字符串,否则直接转换
                if (item.NewValue is Array obj)
                {
                    val =  JsonConvert.SerializeObject( (string[])item.NewValue);
                }
                else if(item.NewValue != null) val = item.NewValue.ToString();

                items.Add(new Grp_OrderPreItem()
                {
                    Id = item.Id,
                    ParentId = item.ParentId,
                    FormTempId = item.FieldTempId,
                    Value = val,
                    CreateUserId = currUserId,
                    Remark = item.Remark
                });
            }

            var addItems = items.Where(x => x.Id <= 0).ToArray();
            var updItems = items.Where(x => x.Id > 0).ToArray();

            _sqlSugar.BeginTran();
            if (dto.Id > 0) //修改
            {
                var infoUpd = await _sqlSugar.Updateable(info)
                    .UpdateColumns(x => new { x.Name, x.GroupId })
                    .ExecuteCommandAsync();

                if (infoUpd < 1)
                {
                    _sqlSugar.RollbackTran();
                    jw.Msg = $"修改失败!";
                    return jw;
                }

                if (addItems.Any()) await _sqlSugar.Insertable(addItems).ExecuteCommandAsync();

                if (updItems.Any()) await _sqlSugar.Updateable(updItems).UpdateColumns(x => new { x.Value, x.Remark }).ExecuteCommandAsync();
            }
            else if (dto.Id <= 0) //新增
            {
                var isNul = await _sqlSugar.Queryable<Grp_OrderPreInfo>().FirstAsync(x => x.IsDel == 0 && x.Name.Equals(dto.Name));
                if (isNul != null)
                {
                    _sqlSugar.RollbackTran();
                    jw.Msg = $"名称重复!";
                    return jw;
                }

                dataId = await _sqlSugar.Insertable(info).ExecuteReturnIdentityAsync();
                if (dataId < 1)
                {
                    _sqlSugar.RollbackTran();
                    jw.Msg = $"新增失败!";
                    return jw;
                }

                // 设置所有项的 ParentId 为新增后的 Id
                foreach (var item in items) item.ParentId = dataId;

                if (items.Any()) await _sqlSugar.Insertable(items).ExecuteCommandAsync();
            }

            _sqlSugar.CommitTran();
            jw.Msg = $"操作成功!";
            jw.Code = StatusCodes.Status200OK;
            jw.Data = dataId;
            return jw;
        }

        /// <summary>
        /// 获取团组下单前信息 Del
        /// </summary>
        /// <param name="dto"></param>
        /// <returns></returns>
        public async Task<JsonView> DelAsync(GroupOrderPreInfoDelDto dto)
        {
            var jw = new JsonView() { Code = StatusCodes.Status400BadRequest, Msg = "操作成功!" };
            int currUserId = dto.CurrUserId,
                id = dto.Id;
            if (currUserId < 1)
            {
                jw.Msg = MsgTips.UserId;
                return jw;
            }
            if (currUserId < 1)
            {
                jw.Msg = MsgTips.Id;
                return jw;
            }

            
            _sqlSugar.BeginTran();
           

            var parentDel = await _sqlSugar.Updateable<Grp_OrderPreInfo>()
                .SetColumns(a => new Grp_OrderPreInfo()
                {
                    DeleteUserId = currUserId,
                    IsDel = 1,
                    DeleteTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")
                })
                .Where(x => x.Id == id)
                .ExecuteCommandAsync(); 
            var subDel = await _sqlSugar.Updateable<Grp_OrderPreItem>()
                .SetColumns(a => new Grp_OrderPreItem()
                {
                    DeleteUserId = currUserId,
                    IsDel = 1,
                    DeleteTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")
                })
                .Where(x => x.ParentId == id)
                .ExecuteCommandAsync();

            _sqlSugar.CommitTran();
            jw.Msg = $"操作成功!";
            jw.Code = StatusCodes.Status200OK;
            return jw;
        }
    }
}