<?php

namespace App\Services\Api\Actions;

use App\Models\Features\FeatureVersion;
use App\Models\Products\Product;
use App\Services\Api\Exceptions\ScssException;
use Illuminate\Http\Request;

class FeaturesAction implements ActionInterface
{
    /**
     * Ejecuta la acción features para obtener features publicadas de un producto
     *
     * @param Request $request
     * @param array $payload
     * @return array
     * @throws ScssException
     */
    public function execute(Request $request, array $payload): array
    {
        /** @var Product $validatedProduct */
        $validatedProduct = $request->input('_validated_product');

        if (!$validatedProduct) {
            throw new ScssException(
                'Product not validated',
                3000,
                401
            );
        }

        $version = $payload['version'] ?? '';

        // Validar que version tiene formato correcto (10 dígitos)
        if (!preg_match('/^\d{10}$/', $version)) {
            throw new ScssException(
                'Invalid version format. Expected YYYYMMDDXX format (10 digits)',
                3003,
                500
            );
        }

        // Buscar versión compatible de Features
        $featureVersion = FeatureVersion::findCompatibleVersion($validatedProduct, $version);

        if (!$featureVersion) {
            throw new ScssException(
                'No compatible features version found for this product version',
                3002,
                404
            );
        }

        // Obtener features publicadas de la versión encontrada, ordenadas por sort_order
        $features = $featureVersion->features()
            ->published()
            ->ordered()
            ->get();

        // Formatear respuesta
        $data = $features->map(function ($feature) {
            return [
                'title' => $feature->title,
                'description' => $feature->description,
                'content_html' => $feature->content_html,
                'thumbnail_url' => $feature->thumbnail_url,
                'header_url' => $feature->header_url,
                'sort_order' => $feature->sort_order,
                'updated_at' => $feature->updated_at->toIso8601String(),
            ];
        })->toArray();

        return $data;
    }
}

