<?php

namespace App\Services\Api\Actions;

use App\Models\Resources\ResourceVersion;
use App\Models\Products\Product;
use App\Services\Api\Exceptions\ResourcesException;
use Illuminate\Http\Request;

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

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

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

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

        // Buscar versión compatible de Recursos
        $resourceVersion = ResourceVersion::findCompatibleVersion($validatedProduct, $version);

        if (!$resourceVersion) {
            throw new ResourcesException(
                'No compatible resources version found for this product version',
                5002,
                404
            );
        }

        // Obtener recursos publicados y públicos de la versión encontrada, ordenados por sort_order
        $resources = $resourceVersion->resources()
            ->published()
            ->public()
            ->ordered()
            ->get();

        // Formatear respuesta
        $data = $resources->map(function ($resource) {
            $result = [
                'title' => $resource->title,
                'description' => $resource->description,
                'type' => $resource->type,
                'read_time' => $resource->read_time,
                'sort_order' => $resource->sort_order,
                'updated_at' => $resource->updated_at->toIso8601String(),
            ];

            // Si es un archivo, incluir file_url si es público
            if ($resource->type === 'file') {
                $result['file_url'] = $resource->file_url;
                $result['original_filename'] = $resource->original_filename;
                $result['size'] = $resource->size;
                $result['mime'] = $resource->mime;
            } else {
                // Si es externo, incluir url
                $result['url'] = $resource->url;
            }

            return $result;
        })->toArray();

        return $data;
    }
}

