<?php

namespace App\Livewire\Environments\Components;

use App\Models\Environments\Environment;
use App\Models\Environments\Type;
use App\Rules\UniqueEnvironmentDomain;
use Livewire\Component;

class EnvironmentForm extends Component
{
    public string $name = '';
    public string $domain = '';
    public ?string $description = null;
    public string $version = '';
    public string $env = 'local';
    public ?int $client_id = null;
    public ?int $type_id = null;
    public bool $active = true;

    public function mount(?int $client_id = null, array $initialData = [])
    {
        $this->client_id = $client_id;
        $this->env = 'local';

        // Pre-llenar con datos iniciales si se proporcionan
        if (!empty($initialData)) {
            $this->name = $initialData['name'] ?? '';
            $this->domain = $initialData['domain'] ?? '';
            $this->description = $initialData['description'] ?? null;
            $this->version = $initialData['version'] ?? '';
            $this->env = $initialData['env'] ?? 'local';
            $this->type_id = $initialData['type_id'] ?? null;
            $this->active = $initialData['active'] ?? true;
        }
    }

    protected function rules()
    {
        return [
            'name' => 'required|string|max:255',
            'domain' => ['required', 'string', 'max:255', new UniqueEnvironmentDomain($this->env)],
            'description' => 'nullable|string',
            'version' => 'required|string|max:50',
            // La lista vive en el modelo: de su valor depende el índice único del
            // dominio, que exime a los locales con un `CASE WHEN env = 'local'`
            // (MGR-010).
            'env' => Environment::reglaDeEnv(),
            'client_id' => 'required|exists:clients,id',
            'type_id' => 'nullable|exists:types,id',
            // `boolean` y no `accepted`: con `accepted` desmarcar la casilla daba «The
            // active field must be accepted» y el entorno se quedaba activo, o sea que
            // **no se podía desactivar ninguno**. `accepted` es para un «acepto los
            // términos», donde false es inválido; aquí false es la mitad del sentido del
            // campo.
            'active' => 'boolean',
        ];
    }

    public function save()
    {
        // ⚠️ COMPONENTE MUERTO: nada lo renderiza (ni ruta ni plantilla), así que hoy
        // es inalcanzable —sin render no hay snapshot firmado y sin snapshot no se puede
        // invocar un método—. El `authorize()` se pone igualmente para que, si alguien
        // lo revive, no lo revive con el agujero. Pendiente de decidir si se borra:
        // ver known-issues MGR-005.
        $this->authorize('admin.environments.edit');

        $validated = $this->validate();
        $validated['active'] = $this->active;

        $environment = Environment::create($validated);

        // Emitir evento con los datos del entorno creado
        $this->dispatch('environmentSaved', [
            'environment' => $environment,
            'environment_id' => $environment->id,
        ]);

        return $environment;
    }

    public function render()
    {
        return view('livewire.environments.components.environment-form', [
            'types' => Type::orderBy('name')->get(),
            'envs' => Environment::envs(),
        ]);
    }
}

