<?php
declare(strict_types=1);

namespace PpPhp\Core\Platform\Event\Consumer;

final class QueueConsumerStore
{
    public const CACHE_DIR = 'storage/cache/events/consumer';
    public const STATE_FILE = 'consumer-runtime.json';

    public function __construct(
        private readonly string $basePath,
        private readonly QueueConsumerRuntimeSerializer $serializer = new QueueConsumerRuntimeSerializer()
    ) {}

    public function stateFile(): string
    {
        return rtrim($this->basePath, DIRECTORY_SEPARATOR) . '/' . self::CACHE_DIR . '/' . self::STATE_FILE;
    }

    public function save(QueueConsumer $consumer): QueueConsumerRuntimeState
    {
        $batchStats = method_exists($consumer, 'batchEngine')
            ? $consumer->batchEngine()->statistics()->toArray()
            : [];

        $state = new QueueConsumerRuntimeState(
            $consumer->statistics()->toArray(),
            $consumer->snapshot()->toArray(),
            $batchStats,
            date('c')
        );

        $file = $this->stateFile();

        if (!is_dir(dirname($file))) {
            mkdir(dirname($file), 0775, true);
        }

        file_put_contents($file, $this->serializer->encode($state));

        return $state;
    }

    public function load(): QueueConsumerRuntimeState
    {
        $file = $this->stateFile();

        if (!is_file($file)) {
            return new QueueConsumerRuntimeState();
        }

        return $this->serializer->decode((string) file_get_contents($file));
    }

    public function reset(): void
    {
        $file = $this->stateFile();

        if (is_file($file)) {
            unlink($file);
        }
    }

    public function exists(): bool
    {
        return is_file($this->stateFile());
    }
}
