<?php declare(strict_types=1);

namespace App\Repositories;

use App\Dto\Repository\DataCaptchaRepository\DataCaptcha;
use App\Exceptions\Repositories\DataCaptchaRepositoryException;
use App\Models\Captcha;
use App\Services\GenerateTokenCommand\GenerateTokenUlidCommand;
use Carbon\Carbon;
use Illuminate\Support\Facades\Cache;

final readonly class DataCaptchaRepository
{
    public function __construct(
        private GenerateTokenUlidCommand $generateTokenUlidCommand,
    ) { }

    public function store(Captcha $captcha, array $coordinators, Carbon $expires): string
    {
        $key = $this->generateTokenUlidCommand->execute() . '_' . time();
        $data = [
            'id' => $captcha->id,
            'coordinators' => $coordinators
        ];

        if (!Cache::driver('redis')->add($key, $data, $expires) ) {
            throw new DataCaptchaRepositoryException('Could not create cache for captcha: ' . $captcha->id . ' key: ' . $key);
        }

        return $key;
    }

    public function getByKey(string $key): ?DataCaptcha
    {
        $dataCaptcha = Cache::driver('redis')->get($key);
        if (is_null($dataCaptcha)) {
            return null;
        }

        return new DataCaptcha(
            captchaId: $dataCaptcha['id'],
            coordinators: $dataCaptcha['coordinators'],
        );
    }

    public function destroy(string $key): void
    {
        Cache::driver('redis')->delete($key);
    }
}
