<?php

declare(strict_types=1);

namespace App\Service;

use App\DTO\SyncConfirmation;
use App\DTO\SyncExecutionResult;
use App\DTO\SyncPreviewResult;
use App\Entity\ModelType;
use App\Service\Sync\SyncStrategyInterface;
use LogicException;
use Symfony\Component\DependencyInjection\Attribute\AutowireIterator;

class ModelTypeSyncService
{
    /** @param iterable<SyncStrategyInterface> $strategies */
    public function __construct(
        #[AutowireIterator('app.sync_strategy')]
        private readonly iterable $strategies,
    ) {}

    public function preview(ModelType $modelType, array $newStructure): SyncPreviewResult
    {
        foreach ($this->strategies as $strategy) {
            if ($strategy->supports($modelType)) {
                return $strategy->preview($modelType, $newStructure);
            }
        }

        throw new LogicException('No sync strategy found for category: '.$modelType->getCategory()->value);
    }

    public function execute(ModelType $modelType, SyncConfirmation $confirmation): SyncExecutionResult
    {
        foreach ($this->strategies as $strategy) {
            if ($strategy->supports($modelType)) {
                return $strategy->execute($modelType, $confirmation);
            }
        }

        throw new LogicException('No sync strategy found for category: '.$modelType->getCategory()->value);
    }
}
