<?php

namespace App\Livewire\Clients;

use App\Models\Clients\Client;
use App\Models\Products\Product;
use Livewire\Component;

class Show extends Component
{
    public Client $client;
    public string $search = '';
    public string $typeFilter = 'all';

    public function mount(Client $client)
    {
        $this->client = $client->load([
            'environments.licenseToken.products',
            'environments.type',
            'tokens'
        ]);
    }

    /**
     * Obtiene los productos únicos del cliente a través de sus licencias.
     *
     * @return \Illuminate\Database\Eloquent\Collection
     */
    public function getUniqueProductsProperty()
    {
        return Product::whereHas('tokens', function ($query) {
            $query->where('client_id', $this->client->id);
        })
        ->whereNotNull('image')
        ->distinct()
        ->get();
    }

    /**
     * Abre la modal de contactos del cliente.
     */
    public function openContactsModal()
    {
        $this->dispatch('openModal',
            component: \App\Livewire\Clients\Modals\Contacts::class,
            arguments: [
                'client' => $this->client,
            ]
        );
    }

    /**
     * Obtiene los entornos filtrados del cliente.
     *
     * @return \Illuminate\Database\Eloquent\Collection
     */
    public function getFilteredEnvironmentsProperty()
    {
        $environments = $this->client->environments;

        // Filtrar por búsqueda (nombre o dominio)
        if (!empty($this->search)) {
            $searchLower = strtolower($this->search);
            $environments = $environments->filter(function ($environment) use ($searchLower) {
                return str_contains(strtolower($environment->name), $searchLower)
                    || str_contains(strtolower($environment->domain), $searchLower);
            });
        }

        // Filtrar por tipo de entorno
        if ($this->typeFilter !== 'all') {
            $environments = $environments->filter(function ($environment) {
                return $environment->env === $this->typeFilter;
            });
        }

        return $environments;
    }

    public function render()
    {
        return view('livewire.clients.show', [
            'client' => $this->client,
        ])->layout('layouts.app');
    }
}
