<?php

namespace App\Livewire\Scss;

use App\Models\Products\Product;
use App\Models\Scss\ScssFile;
use App\Models\Scss\ScssVersion;
use App\Services\Scss\ScssStorageService;
use Livewire\Component;

class Edit extends Component
{
    public Product $product;
    public ScssVersion $scssVersion;
    public ScssFile $scssFile;
    public string $filename = '';
    public string $content = '';
    public ?string $scssValidationError = null;
    public bool $scssValid = true;

    public function mount(Product $product, ScssVersion $scssVersion, ScssFile $scssFile)
    {
        $this->product = $product;
        $this->scssVersion = $scssVersion;
        $this->scssFile = $scssFile->load(['scssVersion.product', 'creator', 'updater']);
        $this->filename = $scssFile->filename;
        $this->content = $scssFile->content;
    }

    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 (puede mejorarse con librería externa)
        // Por ahora solo verificamos que no esté vacío
        $this->scssValid = true;
    }

    public function save()
    {
        $this->authorize('admin.scss.file.edit');
        
        // Validar SCSS antes de guardar
        $this->validateScss();

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

        // Validar que el nombre del archivo no haya cambiado o que no exista otro con ese nombre
        if ($this->filename !== $this->scssFile->filename) {
            $exists = ScssFile::where('scss_version_id', $this->scssFile->scss_version_id)
                ->where('filename', $this->filename)
                ->where('id', '!=', $this->scssFile->id)
                ->exists();

            if ($exists) {
                $this->addError('filename', 'Ya existe un archivo con este nombre para esta versión.');
                return;
            }

            // Si cambió el nombre, eliminar el archivo físico antiguo
            ScssStorageService::deleteFile(
                $this->product,
                $this->scssFile->scssVersion,
                $this->scssFile->filename
            );
        }

        // Actualizar en BD
        $this->scssFile->update([
            'filename' => $this->filename,
            'content' => $this->content,
            'updated_by' => auth()->id(),
        ]);

        // Actualizar archivo físico en storage
        $saved = ScssStorageService::saveFile(
            $this->product,
            $this->scssFile->scssVersion,
            $this->filename,
            $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.file.show', [$this->product, $this->scssVersion, $this->scssFile]), navigate: true);
    }

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