<?php

namespace App\Livewire\Js;

use App\Models\Products\Product;
use App\Models\Js\JsFile;
use App\Models\Js\JsVersion;
use App\Services\Js\JsStorageService;
use Livewire\Component;

class Edit extends Component
{
    public Product $product;
    public JsVersion $jsVersion;
    public JsFile $jsFile;
    public string $filename = '';
    public string $content = '';
    public ?string $jsValidationError = null;
    public bool $jsValid = true;

    public function mount(Product $product, JsVersion $jsVersion, JsFile $jsFile)
    {
        $this->product = $product;
        $this->jsVersion = $jsVersion;
        $this->jsFile = $jsFile->load(['jsVersion.product', 'creator', 'updater']);
        $this->filename = $jsFile->filename;
        $this->content = $jsFile->content;
    }

    public function validateJs()
    {
        $this->jsValidationError = null;
        $this->jsValid = true;

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

        // Validación básica de sintaxis JS (puede mejorarse con librería externa)
        // Por ahora solo verificamos que no esté vacío
        $this->jsValid = true;
    }

    public function save()
    {
        $this->authorize('admin.js.file.edit');
        
        // Validar JS antes de guardar
        $this->validateJs();

        if (!$this->jsValid) {
            $this->addError('content', $this->jsValidationError ?? 'JS inválido');
            return;
        }

        // Validar que el nombre del archivo no haya cambiado o que no exista otro con ese nombre
        if ($this->filename !== $this->jsFile->filename) {
            $exists = JsFile::where('js_version_id', $this->jsFile->js_version_id)
                ->where('filename', $this->filename)
                ->where('id', '!=', $this->jsFile->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
            JsStorageService::deleteFile(
                $this->product,
                $this->jsFile->jsVersion,
                $this->jsFile->filename
            );
        }

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

        // Actualizar archivo físico en storage
        $saved = JsStorageService::saveFile(
            $this->product,
            $this->jsFile->jsVersion,
            $this->filename,
            $this->content
        );

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

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

        return $this->redirect(route('products.js.file.show', [$this->product, $this->jsVersion, $this->jsFile]), navigate: true);
    }

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

