<?php declare(strict_types=1);

namespace App\Engine\Admin\Auth;

/**
 * @extends \Doctrine\Bundle\DoctrineBundle\Repository\ServiceEntityRepository<\App\Engine\Admin\Auth\WebauthnCredential>
 */
class WebauthnCredentialRepository
    extends \Doctrine\Bundle\DoctrineBundle\Repository\ServiceEntityRepository
    implements \Webauthn\Bundle\Repository\PublicKeyCredentialSourceRepositoryInterface,
               \Webauthn\Bundle\Repository\CanSaveCredentialSource
{

    public function __construct(
        \Doctrine\Persistence\ManagerRegistry $registry,
    ) {
        parent::__construct($registry, WebauthnCredential::class);
    }

    public function saveCredentialSource(\Webauthn\CredentialRecord $credentialRecord): void
    {
        if (!$credentialRecord instanceof WebauthnCredential) {
            $credentialRecord = new WebauthnCredential(
                $credentialRecord->publicKeyCredentialId,
                $credentialRecord->type,
                $credentialRecord->transports,
                $credentialRecord->attestationType,
                $credentialRecord->trustPath,
                $credentialRecord->aaguid,
                $credentialRecord->credentialPublicKey,
                $credentialRecord->userHandle,
                $credentialRecord->counter
            );
        }

        $this->getEntityManager()->persist($credentialRecord);
        $this->getEntityManager()->flush();
    }

    public function findAllForUserEntity(\Webauthn\PublicKeyCredentialUserEntity $publicKeyCredentialUserEntity): array
    {
        return $this->createQueryBuilder("c")
            ->select('c')
            ->where('c.userHandle = :userHandle')
            ->setParameter(':userHandle', $publicKeyCredentialUserEntity->id)
            ->getQuery()
            ->execute();
    }

    public function findOneByCredentialId(string $publicKeyCredentialId): ?\Webauthn\CredentialRecord
    {
        return $this->createQueryBuilder("c")
            ->select('c')
            ->where('c.publicKeyCredentialId = :publicKeyCredentialId')
            ->setParameter(':publicKeyCredentialId', base64_encode($publicKeyCredentialId))
            ->setMaxResults(1)
            ->getQuery()
            ->getOneOrNullResult();
    }


}