<?php

namespace App\Services\Api;

use App\Services\Api\Actions\ActionInterface;
use App\Services\Api\Actions\DataAction;
use App\Services\Api\Actions\FeaturesAction;
use App\Services\Api\Actions\JsAction;
use App\Services\Api\Actions\LicenceAction;
use App\Services\Api\Actions\PluginsAction;
use App\Services\Api\Actions\ProductsAction;
use App\Services\Api\Actions\ScssAction;
use App\Services\Api\Actions\ScssCdnAction;
use App\Services\Api\Actions\SetupAction;
use App\Services\Api\Actions\StatsAction;
use App\Services\Api\Actions\SyncAction;
use App\Services\Api\Actions\TutorialsAction;
use App\Services\Api\Actions\ResourcesAction;
use Illuminate\Http\Request;

class ActionResolver
{
    /**
     * Mapeo de acciones a sus clases correspondientes
     */
    private const ACTION_MAP = [
        'sync' => SyncAction::class,
        'licence' => LicenceAction::class,
        'products' => ProductsAction::class,
        'scss' => ScssAction::class,
        'scss-cdn' => ScssCdnAction::class,
        'js' => JsAction::class,
        'setup' => SetupAction::class,
        'data' => DataAction::class,
        'plugins' => PluginsAction::class,
        'stats' => StatsAction::class,
        'features' => FeaturesAction::class,
        'tutorials' => TutorialsAction::class,
        'resources' => ResourcesAction::class,
    ];

    /**
     * Resuelve y ejecuta la acción correspondiente
     *
     * @param string $action
     * @param Request $request
     * @param array $payload
     * @return array
     * @throws \InvalidArgumentException
     */
    public function resolve(string $action, Request $request, array $payload): array
    {
        if (!isset(self::ACTION_MAP[$action])) {
            throw new \InvalidArgumentException("Acción '{$action}' no reconocida.");
        }

        $actionClass = self::ACTION_MAP[$action];

        if (!class_exists($actionClass)) {
            throw new \RuntimeException("La clase de acción '{$actionClass}' no existe.");
        }

        /** @var ActionInterface $actionInstance */
        $actionInstance = new $actionClass();

        return $actionInstance->execute($request, $payload);
    }
}

