<?php

namespace App\Auth\UseCases\AuthenticateUser;

use App\Auth\PasswordHasher;
use App\Exceptions\BadRequestException;
use App\Exceptions\UnauthorizedException;
use App\Shared\ValueObject\EmailAddress;
use App\User\User;
use App\User\UserRepository;

class AuthenticateUser
{
    public function __construct(
        private UserRepository $userRepo,
        private PasswordHasher $hasher,
    ) {
    }

    /**
     * @throws BadRequestException
     * @throws UnauthorizedException
     */
    public function execute(AuthenticateUserRequest $request): User
    {
        if ($request->email === null || $request->email === '') {
            throw new BadRequestException('email is required');
        }
        if ($request->password === null || $request->password === '') {
            throw new BadRequestException('password is required');
        }

        $user = $this->userRepo->findByEmail(
            new EmailAddress($request->email)
        );
        if ($user === null) {
            throw new UnauthorizedException('invalid credentials');
        }

        $passwordMatches = $this->hasher->verify(
            $request->password,
            $user->getPasswordHash(),
        );
        if (! $passwordMatches) {
            throw new UnauthorizedException('invalid credentials');
        }

        return $user;
    }
}
