<?php

declare(strict_types=1);

namespace App\Framework\EventSourcing\Demo;

use App\Framework\EventSourcing\AggregateId;
use App\Framework\EventSourcing\AggregateRoot;

final readonly class DemoAggregate
{
    public function __construct(
        public AggregateRoot $root,
    ) {
    }

    public static function create(AggregateId $aggregateId, DemoAggregateDomainId $id): self
    {
        $root = new AggregateRoot(new AggregateState(), $aggregateId);
        $root->eventRecorder->record(new DemoAggregateEvent($id));

        return new self($root);
    }

    public static function rehydrate(AggregateId $id, iterable $events): self
    {
        $root = AggregateRoot::rehydrate($id, new AggregateState(), $events);

        return new self($root);
    }

    public function eventHappened(DemoAggregateEvent $event): void
    {
        $this->root->applyAndRecord($event);
    }
}
