using Brizco.Domain.Entities.Task;
using System.Linq;
using Brizco.Domain.Entities.Routine;
using Brizco.Domain.Entities.Shift;
using Task = Brizco.Domain.Entities.Task.Task;

namespace Brizco.Core.CoreServices;

public class PageService : IPageService
{
    private readonly ICurrentUserService _currentUserService;
    private readonly IRepositoryWrapper _repositoryWrapper;
    private readonly RoleManager<ApplicationRole> _roleManager;

    public PageService(
        ICurrentUserService currentUserService,
        IRepositoryWrapper repositoryWrapper,
        RoleManager<ApplicationRole> roleManager)
    {
        _currentUserService = currentUserService;
        _repositoryWrapper = repositoryWrapper;
        _roleManager = roleManager;
    }
    public async Task<AppDashboardPageDto> GetAppDashboardAsync(CancellationToken cancellationToken)
    {
        if (_currentUserService.UserId == null)
            throw new AppException("User id is null ");
        if (Guid.TryParse(_currentUserService.UserId, out Guid userId)!)
            throw new AppException("User id is wrong");
        if (Guid.TryParse(_currentUserService.ComplexId, out Guid complexId)!)
            throw new AppException("Complex id is wrong");

        var todayTasks = await _repositoryWrapper.SetRepository<Activity>()
            .TableNoTracking
            .Where(a => a.UserId == userId)
            .ToListAsync(cancellationToken);
        var page = new AppDashboardPageDto
        {
            DoneActivitiesToday = todayTasks.Count(t => t.IsDone),
            TotalActivitiesToday = todayTasks.Count,
            UnDoneActivitiesToday = todayTasks.Count(t => t.IsDone!)
        };

        if (_currentUserService.Permissions != null)
        {
            int totalStepCount = 0;
            int completeStepCount = 0;
            string currentStep = string.Empty;
            if (_currentUserService.Permissions.Exists(s => s == ApplicationPermission.ManageRoutines))
            {
                totalStepCount++;
                var hasRoutine = await _repositoryWrapper.SetRepository<Routine>()
                    .TableNoTracking
                    .AnyAsync(r=>r.ComplexId== complexId, cancellationToken);
                if(hasRoutine)
                    completeStepCount++;
                else
                {
                    if (currentStep.IsNullOrEmpty())
                        currentStep = "تکمیل بخش روتین ها";
                }
            }
            if (_currentUserService.Permissions.Exists(s => s == ApplicationPermission.ManageSections))
            {
                totalStepCount++;
                var hasSection = await _repositoryWrapper.SetRepository<Section>()
                    .TableNoTracking
                    .AnyAsync(r => r.ComplexId == complexId, cancellationToken);
                if (hasSection)
                    completeStepCount++;
                else
                {
                    if (currentStep.IsNullOrEmpty())
                        currentStep = "تکمیل بخش سکشن ها";
                }
            }
            if (_currentUserService.Permissions.Exists(s => s == ApplicationPermission.ManagePositions))
            {
                totalStepCount++;
                var hasPosition = await _repositoryWrapper.SetRepository<Position>()
                    .TableNoTracking
                    .AnyAsync(r => r.ComplexId == complexId, cancellationToken);
                if (hasPosition)
                    completeStepCount++;
                else
                {
                    if (currentStep.IsNullOrEmpty())
                        currentStep = "تکمیل بخش پوزیشن ها";
                }
            }
            if (_currentUserService.Permissions.Exists(s => s == ApplicationPermission.ManageStaffs))
            {
                totalStepCount++;
                var hasStaff = await _repositoryWrapper.SetRepository<ComplexUser>()
                    .TableNoTracking
                    .AnyAsync(r => r.ComplexId == complexId, cancellationToken);
                if (hasStaff)
                    completeStepCount++;
                else
                {
                    if (currentStep.IsNullOrEmpty())
                        currentStep = "تکمیل بخش کاربر ها";
                }
            }
            if (_currentUserService.Permissions.Exists(s => s == ApplicationPermission.ManageShifts))
            {
                totalStepCount++;
                var hasShift = await _repositoryWrapper.SetRepository<Shift>()
                    .TableNoTracking
                    .AnyAsync(r => r.ComplexId == complexId, cancellationToken);
                if (hasShift)
                    completeStepCount++;
                else
                {
                    if (currentStep.IsNullOrEmpty())
                        currentStep = "تکمیل بخش شیفت ها";
                }
            }
            if (_currentUserService.Permissions.Exists(s => s == ApplicationPermission.ManageTasks))
            {
                totalStepCount++;
                var hasTask = await _repositoryWrapper.SetRepository<Task>()
                    .TableNoTracking
                    .AnyAsync(r => r.ComplexId == complexId, cancellationToken);
                if (hasTask)
                    completeStepCount++;
                else
                {
                    if (currentStep.IsNullOrEmpty())
                        currentStep = "تکمیل بخش تسک ها";
                }
            }
            if (_currentUserService.Permissions.Exists(s => s == ApplicationPermission.ManageShiftPlans))
            {
                totalStepCount++;
                var hasStaff = await _repositoryWrapper.SetRepository<ShiftPlan>()
                    .TableNoTracking
                    .AnyAsync(r => r.ComplexId == complexId, cancellationToken);
                if (hasStaff)
                    completeStepCount++;
                else
                {
                    if (currentStep.IsNullOrEmpty())
                        currentStep = "تکمیل بخش شیفت بندی ها";
                }
            }

            page.SignUpCompletePercent = ((totalStepCount * 100) / completeStepCount);
            page.CurrentSignUpStep = currentStep;

        }

        return page;
    }
}