namespace Brizco.Repository.Handlers.Task;

public class CreateActivityCommandHandler : IRequestHandler<CreateTaskCommand, TaskLDto>
{
    private readonly IRepositoryWrapper _repositoryWrapper;
    private readonly ICurrentUserService _currentUserService;

    public CreateActivityCommandHandler(IRepositoryWrapper repositoryWrapper,ICurrentUserService currentUserService)
    {
        _repositoryWrapper = repositoryWrapper;
        _currentUserService = currentUserService;
    }
    public async Task<TaskLDto> Handle(CreateTaskCommand request, CancellationToken cancellationToken)
    {
        if (_currentUserService.ComplexId == null)
            throw new AppException("ComplexId is null", ApiResultStatusCode.NotFound);
        if (!Guid.TryParse(_currentUserService.ComplexId, out Guid complexId))
            throw new AppException("ComplexId is wrong", ApiResultStatusCode.NotFound);
        var task = Domain.Entities.Task.Task
            .Create(request.Title,
                request.Description,
                request.Type,
                request.IsDisposable,
                DateTimeExtensions.UnixTimeStampToDateTime(request.SetFor),
                request.HasDisposed,
                request.Amount,
                request.AmountType,
                complexId,
                request.ScheduleType);

        if (request.Routines.Count == 0)
            throw new AppException("لطفا روتین های وظیفه را انتخاب نمایید");
        task.AddRoutine(request.Routines.ToArray());

        if (request.Shifts.Count == 0)
            throw new AppException("اگر فعالیت برای یک گروه نقش انتخاب شده باشد باید لیست نقش ها را ارسال نمایید");
        task.AddShift(request.Shifts.ToArray());

        if (request.Positions.Count == 0)
            throw new AppException("اگر فعالیت برای یک گروه نقش انتخاب شده باشد باید لیست نقش ها را ارسال نمایید");
        task.AddPosition(request.Positions.ToArray());

        if (task.ScheduleType == TaskScheduleType.Weekly && request.Days.Count == 0)
            throw new AppException("اگر تکرار فعالیت به صورت هفتگی باشد باید روزهای ان هفته را انتخاب کنید");
        request.Days.ForEach(d=>task.SetDay(d));


        _repositoryWrapper.SetRepository<Domain.Entities.Task.Task>().Add(task);
        await _repositoryWrapper.SaveChangesAsync(cancellationToken);
        return task.AdaptToLDto();
    }
}