<?php

declare(strict_types=1);

namespace App\Framework\EventSourcing\Snapshots;

use App\Framework\EventSourcing\AggregateRoot;

/**
 * Every N Events Snapshot Strategy
 *
 * Creates snapshot every N events (e.g., every 100 events)
 */
final readonly class EveryNEventsStrategy implements SnapshotStrategy
{
    public function __construct(
        private int $eventThreshold = 100
    ) {
    }

    public function shouldTakeSnapshot(AggregateRoot $aggregate): bool
    {
        return $aggregate->getVersion() % $this->eventThreshold === 0;
    }

    public static function every100Events(): self
    {
        return new self(100);
    }

    public static function every50Events(): self
    {
        return new self(50);
    }

    public static function every10Events(): self
    {
        return new self(10);
    }
}
