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.IsRelatedToShift,
                request.IsRelatedToRole,
                request.IsRelatedToPerson,
                request.IsDisposable,
                request.SetFor,
                request.HasDisposed,
                request.Amount,
                request.AmountType,
                complexId);

        if (task.IsRelatedToPerson)
        {
            if (request.Users.Count == 0)
                throw new AppException("اگر فعالیت برای یک فرد انتخاب شده باشد باید لیست افراد را ارسال نمایید");
            task.AddUser(request.Users.ToArray());
        }

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

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

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