using LiteCqrs;
using TeleWave.Application.Admin.Roles;
using TeleWave.Application.Common.Interfaces;
using TeleWave.Application.Common.Models;

namespace TeleWave.Application.Admin.Users.CreateUser;

public sealed class CreateUserCommandHandler(
    IIdentityService identityService,
    IRoleService roleService
) : ICommandHandler<CreateUserCommand, Result<Guid>>
{
    public async Task<Result<Guid>> Handle(
        CreateUserCommand command,
        CancellationToken cancellationToken
    )
    {
        // Роль проверяем до создания, чтобы не оставить пользователя с ролью по умолчанию при опечатке.
        var roles = await roleService.ListRolesAsync(cancellationToken);
        if (roles.All(r => r.Id != command.RoleId))
            return Result.Failure<Guid>(RoleErrors.NotFound);

        var createResult = await identityService.CreateUserAsync(
            command.UserName,
            command.Password,
            cancellationToken
        );
        if (!createResult.IsSuccess)
            return Result.Failure<Guid>(createResult.Error);

        var userId = createResult.Value;

        // CreateUserAsync назначает роль по умолчанию — выставляем выбранную админом.
        var roleResult = await roleService.ChangeUserRoleAsync(
            userId,
            command.RoleId,
            cancellationToken
        );
        if (!roleResult.IsSuccess)
            return Result.Failure<Guid>(roleResult.Error);

        return Result.Success(userId);
    }
}
