<?php

namespace App\Services\Api\Actions;

use App\Models\Products\Product;
use App\Models\Scss\ScssFile;
use App\Models\Scss\ScssVersion;
use App\Services\Api\Exceptions\ScssException;
use App\Services\Scss\ScssStorageService;
use Illuminate\Http\Request;

class ScssAction implements ActionInterface
{
    /**
     * Ejecuta la acción scss para obtener archivos SCSS del 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 SCSS compatible primero
        $scssVersion = ScssVersion::findCompatibleVersion($validatedProduct, $version);

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

        // Obtener array de archivos solicitados desde data.files
        $requestedFiles = $payload['data']['files'] ?? [];

        // Si files está vacío, obtener todos los archivos de esa versión
        if (empty($requestedFiles)) {
            $allFiles = $scssVersion->files;

            if ($allFiles->isEmpty()) {
                throw new ScssException(
                    'No SCSS files found for this version',
                    3002,
                    404
                );
            }

            // Construir respuesta con todos los archivos encontrados
            $filesResponse = [];
            foreach ($allFiles as $scssFile) {
                $content = ScssStorageService::getFile(
                    $validatedProduct,
                    $scssVersion,
                    $scssFile->filename
                );

                $filesResponse[] = [
                    'filename' => $scssFile->filename,
                    'found' => $content !== null,
                    'content' => $content,
                ];
            }

            return [
                'files' => $filesResponse,
            ];
        }

        // Si se especificaron archivos, buscar cada uno
        $filesResponse = [];

        foreach ($requestedFiles as $requestedFilename) {
            // Buscar archivo específico en la versión compatible
            $scssFile = $scssVersion->files()
                ->where('filename', $requestedFilename)
                ->first();

            if ($scssFile) {
                // Leer contenido del storage
                $content = ScssStorageService::getFile(
                    $validatedProduct,
                    $scssVersion,
                    $scssFile->filename
                );

                $filesResponse[] = [
                    'filename' => $requestedFilename,
                    'found' => $content !== null,
                    'content' => $content,
                ];
            } else {
                // Archivo no encontrado
                $filesResponse[] = [
                    'filename' => $requestedFilename,
                    'found' => false,
                    'content' => null,
                ];
            }
        }

        return [
            'files' => $filesResponse,
        ];
    }
}
