<?php

namespace App\Livewire\LicenseTokens\Components;

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

class EnvironmentSelection extends Component
{
    public ?int $clientId = null;
    public string $mode = 'existing'; // 'existing' o 'new'
    public array $selectedIds = [];
    public string $searchQuery = '';
    
    // Datos para nuevo entorno
    public array $newEnvironmentData = [
        'name' => '',
        'domain' => '',
        'description' => null,
        'version' => '',
        'env' => 'local',
        'type_id' => null,
    ];

    public function mount(?int $clientId = null, string $mode = 'existing', array $selectedIds = [], array $newEnvironmentData = [])
    {
        $this->clientId = $clientId;
        $this->mode = $mode;
        $this->selectedIds = $selectedIds;
        if (!empty($newEnvironmentData)) {
            $this->newEnvironmentData = array_merge($this->newEnvironmentData, $newEnvironmentData);
        }
    }

    public function selectMode($mode)
    {
        $this->mode = $mode;
        $this->dispatch('modeChanged', $mode);
    }

    public function toggleEnvironment($environmentId)
    {
        if (in_array($environmentId, $this->selectedIds)) {
            $this->selectedIds = array_values(array_diff($this->selectedIds, [$environmentId]));
        } else {
            $this->selectedIds[] = $environmentId;
        }
        $this->dispatch('environmentsSelected', $this->selectedIds);
    }

    public function updatedNewEnvironmentDataName()
    {
        $this->dispatch('newEnvironmentDataUpdated', $this->newEnvironmentData);
    }

    public function updatedNewEnvironmentDataDomain()
    {
        $this->dispatch('newEnvironmentDataUpdated', $this->newEnvironmentData);
    }

    public function updatedNewEnvironmentDataDescription()
    {
        $this->dispatch('newEnvironmentDataUpdated', $this->newEnvironmentData);
    }

    public function updatedNewEnvironmentDataVersion()
    {
        $this->dispatch('newEnvironmentDataUpdated', $this->newEnvironmentData);
    }

    public function updatedNewEnvironmentDataEnv()
    {
        $this->dispatch('newEnvironmentDataUpdated', $this->newEnvironmentData);
    }

    public function updatedNewEnvironmentDataTypeId()
    {
        $this->dispatch('newEnvironmentDataUpdated', $this->newEnvironmentData);
    }

    // El método createNewEnvironment ya no se usa, el entorno se crea en el wizard al finalizar

    public function getEnvironmentsProperty()
    {
        if (!$this->clientId) {
            return collect();
        }

        $query = Environment::with('type')
            ->where('client_id', $this->clientId)
            ->orderBy('name');

        if (!empty($this->searchQuery)) {
            $query->where(function($q) {
                $q->where('name', 'like', '%' . $this->searchQuery . '%')
                  ->orWhere('domain', 'like', '%' . $this->searchQuery . '%');
            });
        }

        return $query->get()->map(function ($environment) {
            $environment->is_associated_to_other = $environment->license_token_id !== null;
            return $environment;
        });
    }

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

