using AutoMapper;
using OASystem.Domain.Dtos.Groups;
using OASystem.Domain.Dtos.System;
using OASystem.Domain.Entities.Groups;
namespace OASystem.Infrastructure.Repositories.System
{
    /// 
    /// 审核流程 仓储
    /// 
    public class ApprovalProcessRepository : BaseRepository
    {
        private readonly IMapper _mapper;
        public ApprovalProcessRepository(SqlSugarClient sqlSugar, IMapper mapper) : base(sqlSugar)
        {
            _mapper = mapper;
        }
        /// 
        /// 创建审核流程模板
        /// 
        /// 
        /// 
        public async Task CreateAuditTemplateAsync(ApprovalProcessDto dto)
        {
            var currUserId = dto.CurrUserId;
            var auditTemp = new Sys_AuditTemplate()
            {
                TemplateName = dto.TemplateName,
                TemplateCode = dto.TemplateCode,
                BusinessType = dto.BusinessType,
                Status = dto.Status,
            };
            _sqlSugar.BeginTran();
            var tempId = await _sqlSugar.Insertable(auditTemp).ExecuteReturnIdentityAsync();
            if (tempId < 1)
            {
                _sqlSugar.RollbackTran();
                return false;
            }
            foreach (var item in dto.TempNodes)
            {
                var auditTempNodes = _mapper.Map(item);
                auditTempNodes.TemplateId = tempId;
                auditTempNodes.CreateUserId = currUserId;
                var nodeId = await _sqlSugar.Insertable(auditTempNodes).ExecuteReturnIdentityAsync();
                if (nodeId < 1)
                {
                    _sqlSugar.RollbackTran();
                    return false;
                }
                var nodeUsers = _mapper.Map>(item.NodeUsers);
                nodeUsers.ForEach(x =>
                {
                    x.NodeId = nodeId;
                    x.CreateUserId = currUserId;
                });
                if (nodeUsers.Any())
                {
                    var nodeUsersStatus = await _sqlSugar.Insertable(nodeUsers).ExecuteCommandAsync();
                    if (nodeUsersStatus < 1)
                    {
                        _sqlSugar.RollbackTran();
                        return false;
                    }
                }
            }
            _sqlSugar.CommitTran();
            return true;
        }
        /// 
        /// 获取审核流程模板
        /// 
        /// 
        /// 
        public async Task GetTemplateByBusinessTypeAsync(int auditTempId)
        {
            var tempInfo = new ApprovalProcessView();
            var auditTempInfo = await _sqlSugar.Queryable()
                .FirstAsync(x => x.Id == auditTempId && x.IsDel == 0);
            if (auditTempInfo == null) return tempInfo;
            tempInfo.Id = auditTempInfo.Id;
            tempInfo.TemplateName = auditTempInfo.TemplateName;
            tempInfo.BusinessType = auditTempInfo.BusinessType;
            tempInfo.Status = auditTempInfo.Status;
            var nodes = await _sqlSugar.Queryable()
                .Where(x => x.TemplateId == auditTempId && x.IsDel == 0)
                .Select(x => new AuditTemplateNodeView()
                {
                    Id = x.Id,
                    TemplateId = x.TemplateId,
                    NodeName = x.NodeName,
                    NodeOrder = x.NodeOrder,
                    ApproveType = x.ApproveType,
                    IsRequired = x.IsRequired
                })
                .OrderBy(x => x.NodeOrder)
                .ToListAsync();
            foreach (var node in nodes)
            {
                node.NodeUsers = await _sqlSugar.Queryable()
                    .Where(x => x.NodeId == node.Id && x.IsDel == 0)
                    .Select(x => new AuditTemplateNodeUserView()
                    {
                        Id = x.Id,
                        NodeId = x.NodeId,
                        UserId = x.UserId,
                        UserName = x.UserName
                    })
                    .ToListAsync();
            }
            tempInfo.TempNodes = nodes;
            return tempInfo;
        }
        /// 
        /// 获取审核流程
        /// 
        /// 
        /// 
        public async Task GetFlowByBusinessAsync(int businessId, int businessType)
        {
            return await _sqlSugar.Queryable()
                .FirstAsync(x => x.IsDel == 0 && x.BusinessId == businessId && x.BusinessType == businessType);
        }
        
        /// 
        /// 获取审核模板节点
        /// 
        /// 
        /// 
        public async Task> GetTemplateNodesAsync(int templateId)
        {
            return await _sqlSugar.Queryable()
                .Where(x => x.TemplateId == templateId)
                .OrderBy(x => x.NodeOrder)
                .ToListAsync();
        }
        /// 
        /// 获取审核模板节点用户
        /// 
        /// 
        /// 
        public async Task> GetTemplateNodeUsersAsync(int nodeId)
        {
            return await _sqlSugar.Queryable()
                .Where(x => x.NodeId == nodeId)
                .ToListAsync();
        }
        /// 
        /// 审核、重复操作权限验证
        /// 
        /// 模板Id
        /// 业务类型
        /// 业务类型Id
        /// 用户Id
        /// 
        public async Task VerifyAuditAuthAsync(int tempId,int busTypeId,int busDataId,int userId)
        {
            if (tempId < 1 || busTypeId < 1 || busDataId < 1) return false;
            var flow = await _sqlSugar.Queryable().FirstAsync(x => x.IsDel == 0 && x.BusinessType == busTypeId && x.TemplateId == tempId && x.BusinessId == busDataId);
            if (flow == null) return false;
            if (flow.Status == 2 || flow.Status == 3) return false;
            var node = await _sqlSugar.Queryable()
                .FirstAsync(x => x.IsDel == 0 && x.TemplateId == tempId && x.Id == flow.CurrentNodeId);
            if (node == null) return false;
            return await _sqlSugar.Queryable().AnyAsync(x => x.IsDel == 0 && x.NodeId == node.Id && x.UserId == userId);
        }
    }
}