<?php

/** @noinspection PhpIncompatibleReturnTypeInspection */

namespace App\Repositories;

use App\Models\User;
use App\Values\User\SsoUser;

/**
 * @extends Repository<User>
 */
class UserRepository extends Repository
{
    public function getFirstAdminUser(): User
    {
        return User::firstAdmin();
    }

    public function findOneByEmail(string $email): ?User
    {
        return User::query()->firstWhere('email', $email);
    }

    public function findOneBySso(SsoUser $ssoUser): ?User
    {
        // we prioritize the SSO ID over the email address, but still resort to the latter
        return User::query()->firstWhere([
            'sso_id' => $ssoUser->id,
            'sso_provider' => $ssoUser->provider,
        ]) ?? $this->findOneByEmail($ssoUser->email);
    }

    public function getOneByPublicId(string $publicId): User
    {
        return $this->getOneBy(['public_id' => $publicId]);
    }
}