<?php

namespace MintyPHP\Service\Auth;

use MintyPHP\Repository\Auth\ApiTokenRepository;
use MintyPHP\Repository\Auth\ApiTokenRepositoryInterface;
use MintyPHP\Repository\Auth\EmailVerificationRepository;
use MintyPHP\Repository\Auth\EmailVerificationRepositoryInterface;
use MintyPHP\Repository\Auth\PasswordResetRepository;
use MintyPHP\Repository\Auth\PasswordResetRepositoryInterface;
use MintyPHP\Repository\Auth\RememberTokenRepository;
use MintyPHP\Repository\Auth\RememberTokenRepositoryInterface;
use MintyPHP\Repository\Tenant\TenantMicrosoftAuthRepository;
use MintyPHP\Repository\Tenant\TenantMicrosoftAuthRepositoryInterface;
use MintyPHP\Repository\Tenant\TenantRepository;
use MintyPHP\Repository\Tenant\TenantRepositoryInterface;
use MintyPHP\Repository\User\UserExternalIdentityRepository;
use MintyPHP\Repository\User\UserExternalIdentityRepositoryInterface;

class AuthRepositoryFactory
{
    private ?ApiTokenRepository $apiTokenRepository = null;
    private ?RememberTokenRepository $rememberTokenRepository = null;
    private ?PasswordResetRepository $passwordResetRepository = null;
    private ?EmailVerificationRepository $emailVerificationRepository = null;
    private ?TenantRepository $tenantRepository = null;
    private ?TenantMicrosoftAuthRepository $tenantMicrosoftAuthRepository = null;
    private ?UserExternalIdentityRepository $userExternalIdentityRepository = null;

    public function createApiTokenRepository(): ApiTokenRepositoryInterface
    {
        return $this->apiTokenRepository ??= new ApiTokenRepository();
    }

    public function createRememberTokenRepository(): RememberTokenRepositoryInterface
    {
        return $this->rememberTokenRepository ??= new RememberTokenRepository();
    }

    public function createPasswordResetRepository(): PasswordResetRepositoryInterface
    {
        return $this->passwordResetRepository ??= new PasswordResetRepository();
    }

    public function createEmailVerificationRepository(): EmailVerificationRepositoryInterface
    {
        return $this->emailVerificationRepository ??= new EmailVerificationRepository();
    }

    public function createTenantRepository(): TenantRepositoryInterface
    {
        return $this->tenantRepository ??= new TenantRepository();
    }

    public function createTenantMicrosoftAuthRepository(): TenantMicrosoftAuthRepositoryInterface
    {
        return $this->tenantMicrosoftAuthRepository ??= new TenantMicrosoftAuthRepository();
    }

    public function createUserExternalIdentityRepository(): UserExternalIdentityRepositoryInterface
    {
        return $this->userExternalIdentityRepository ??= new UserExternalIdentityRepository();
    }
}
