<?php
namespace App\Controller;

use OAT\Library\Lti1p3Core\Registration\RegistrationInterface;
use OAT\Library\Lti1p3Core\Registration\RegistrationRepositoryInterface;

class RegistrationRepository implements RegistrationRepositoryInterface
{
     /** @var RegistrationInterface[] */
     private $registrations;

    /** @param RegistrationInterface[] $registrations */
    public function __construct(array $registrations)
    {
        foreach ($registrations as $registration) {
            $this->registrations[$registration->getIdentifier()] = $registration;
        }
    }

    public function find(string $identifier): ?RegistrationInterface
    {
       return $this->registrations[$identifier] ?? null;
    }

    public function findAll(): array
    {
       return $this->registrations;
    }

   public function findByClientId(string $clientId) : ?RegistrationInterface
   {
       foreach ($this->registrations as $registration) {
            if ($registration->getClientId() === $clientId) {
                return $registration;
            }
        }

        return null;
    }

   public function findByPlatformIssuer(string $issuer, string $clientId = null): ?RegistrationInterface
   {
        foreach ($this->registrations as $registration) {
            if ($registration->getPlatform()->getAudience() === $issuer) {
                if (null !== $clientId) {
                    if ($registration->getClientId() === $clientId) {
                        return $registration;
                    }
                } else {
                    return $registration;
                }
            }
        }

        return null;
    }

   public function findByToolIssuer(string $issuer, string $clientId = null): ?RegistrationInterface
   {
        foreach ($this->registrations as $registration) {
            if ($registration->getTool()->getAudience() === $issuer) {
                if (null !== $clientId) {
                    if ($registration->getClientId() === $clientId) {
                        return $registration;
                    }
                } else {
                    return $registration;
                }
            }
        }

        return null;
    }
};