<?php

declare(strict_types=1);

namespace App\Support\RestoreSafety;

use InvalidArgumentException;

final readonly class PreviewIntegrityState
{
    public const string STATE_NOT_GENERATED = 'not_generated';

    public const string STATE_CURRENT = 'current';

    public const string STATE_STALE = 'stale';

    public const string STATE_INVALIDATED = 'invalidated';

    public const string FRESHNESS_POLICY = 'invalidate_after_mutation';

    /**
     * @param  list<string>  $invalidationReasons
     */
    public function __construct(
        public string $state,
        public string $freshnessPolicy,
        public ?string $fingerprint,
        public ?string $generatedAt,
        public array $invalidationReasons,
        public bool $rerunRequired,
        public string $displaySummary,
    ) {
        if (! in_array($this->state, [
            self::STATE_NOT_GENERATED,
            self::STATE_CURRENT,
            self::STATE_STALE,
            self::STATE_INVALIDATED,
        ], true)) {
            throw new InvalidArgumentException('Unsupported preview integrity state.');
        }
    }

    public function isCurrent(): bool
    {
        return $this->state === self::STATE_CURRENT;
    }

    /**
     * @return array{
     *     state: string,
     *     freshness_policy: string,
     *     fingerprint: ?string,
     *     generated_at: ?string,
     *     invalidation_reasons: list<string>,
     *     rerun_required: bool,
     *     display_summary: string
     * }
     */
    public function toArray(): array
    {
        return [
            'state' => $this->state,
            'freshness_policy' => $this->freshnessPolicy,
            'fingerprint' => $this->fingerprint,
            'generated_at' => $this->generatedAt,
            'invalidation_reasons' => $this->invalidationReasons,
            'rerun_required' => $this->rerunRequired,
            'display_summary' => $this->displaySummary,
        ];
    }
}
