<?php

namespace App\Livewire\Setups;

use App\Models\Products\Product;
use App\Models\Setups\Setup;
use Livewire\Component;
use Symfony\Component\Yaml\Yaml;
use Symfony\Component\Yaml\Exception\ParseException;

class Edit extends Component
{
    public Product $product;
    public Setup $setup;
    public string $yaml = '';
    public ?string $changeLog = null;
    public ?string $yamlValidationError = null;
    public bool $yamlValid = true;

    public function mount(Product $product, Setup $setup)
    {
        $this->product = $product;
        $this->setup = $setup->load(['product', 'creator', 'updater']);
        $this->yaml = $setup->yaml;
        $this->changeLog = null;
    }

    public function validateYaml()
    {
        $this->yamlValidationError = null;
        $this->yamlValid = true;

        if (empty(trim($this->yaml))) {
            $this->yamlValidationError = 'El YAML no puede estar vacío';
            $this->yamlValid = false;
            return;
        }

        try {
            $parsedData = Yaml::parse($this->yaml);

            if (!is_array($parsedData)) {
                $this->yamlValidationError = 'El YAML no contiene una estructura válida';
                $this->yamlValid = false;
                return;
            }

            $this->yamlValid = true;
        } catch (ParseException $e) {
            $this->yamlValidationError = 'Error de sintaxis YAML: ' . $e->getMessage();
            $this->yamlValid = false;
        } catch (\Exception $e) {
            $this->yamlValidationError = 'Error al procesar YAML: ' . $e->getMessage();
            $this->yamlValid = false;
        }
    }

    public function save()
    {
        $this->authorize('admin.setups.edit');
        
        // Validar YAML antes de guardar
        $this->validateYaml();

        if (!$this->yamlValid) {
            $this->addError('yaml', $this->yamlValidationError ?? 'YAML inválido');
            return;
        }

        // Crear entrada en historial antes de actualizar
        $this->setup->createHistoryEntry($this->changeLog);

        // Actualizar setup
        $this->setup->update([
            'yaml' => $this->yaml,
            'change_log' => $this->changeLog,
            'updated_by' => auth()->id(),
        ]);

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

        return $this->redirect(route('products.setups.show', [$this->product, $this->setup]), navigate: true);
    }

    public function duplicate()
    {
        try {
            $newSetup = $this->setup->duplicate();
            session()->flash('success', "Setup duplicado. Nueva versión: {$newSetup->version}");

            return $this->redirect(route('products.setups.edit', [$this->product, $newSetup]), navigate: true);
        } catch (\Exception $e) {
            $this->addError('duplicate', $e->getMessage());
        }
    }

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

