<?php

namespace App\Livewire\ScssCdn;

use App\Models\Products\Product;
use App\Models\ScssCdn\ScssCdnBundle;
use App\Models\ScssCdn\ScssCdnFile;
use App\Services\ScssCdn\ScssCdnImportParser;
use App\Services\ScssCdn\ScssCdnStorageService;
use App\Services\ScssCdn\ScssCdnUrlService;
use Livewire\Component;

class FileEdit extends Component
{
    public Product $product;
    public ScssCdnBundle $bundle;
    public ScssCdnFile $file;
    public string $content = '';
    public ?string $scssValidationError = null;
    public bool $scssValid = true;

    public function mount(Product $product, ScssCdnBundle $bundle, ScssCdnFile $file)
    {
        $this->product = $product;
        $this->bundle = $bundle->load('product');
        $this->file = $file->load(['bundle', 'creator', 'updater']);

        // Verificar que el archivo pertenezca al bundle y el bundle al producto
        if ($this->file->scss_cdn_bundle_id !== $this->bundle->id) {
            abort(404, 'El archivo no pertenece a este bundle.');
        }
        if ($this->bundle->product_id !== $this->product->id) {
            abort(404, 'El bundle no pertenece a este producto.');
        }

        // Leer contenido desde storage
        $this->content = ScssCdnStorageService::getFile(
            $this->product,
            $this->bundle,
            $this->file->relative_path
        ) ?? '';
    }

    public function validateScss()
    {
        $this->scssValidationError = null;
        $this->scssValid = true;

        if (empty(trim($this->content))) {
            $this->scssValidationError = 'El contenido SCSS no puede estar vacío';
            $this->scssValid = false;
            return;
        }

        // Validación básica de sintaxis SCSS
        $this->scssValid = true;
    }

    public function save()
    {
        // Validar SCSS antes de guardar
        $this->validateScss();

        if (!$this->scssValid) {
            $this->addError('content', $this->scssValidationError ?? 'SCSS inválido');
            return;
        }

        try {
            // Actualizar en BD (solo updated_by)
            $this->file->update([
                'updated_by' => auth()->id(),
            ]);

            // Actualizar archivo físico en storage
            $saved = ScssCdnStorageService::saveFile(
                $this->product,
                $this->bundle,
                $this->file->relative_path,
                $this->content
            );

            if (!$saved) {
                $this->addError('content', 'Error al guardar el archivo físico.');
                return;
            }

            session()->flash('success', 'Archivo SCSS actualizado correctamente.');

            return $this->redirect(route('products.scss-cdn.bundle.show', [$this->product, $this->bundle]), navigate: true);
        } catch (\Exception $e) {
            $this->addError('content', 'Error al guardar: ' . $e->getMessage());
        }
    }

    public function getFileUrl()
    {
        return ScssCdnUrlService::getFileUrl($this->file);
    }

    public function render()
    {
        return view('livewire.scss-cdn.file-edit', [
            'product' => $this->product,
            'fileUrl' => $this->getFileUrl(),
        ])->layout('layouts.clean');
    }
}
