<?php

namespace App\Livewire\Territori;

use Livewire\Component;
use Livewire\WithPagination;
use App\Models\Territorio;
use App\Models\Zona;
use App\Models\Tipologia;

class TerritorioIndex extends Component
{
    use WithPagination;

    public string $search = '';
    public string $filterZona = '';
    public string $filterTipologia = '';
    public string $filterStato = '';
    public string $sortField = 'numero';
    public string $sortDirection = 'asc';

    protected $queryString = [
        'search' => ['except' => ''],
        'filterZona' => ['except' => ''],
        'filterTipologia' => ['except' => ''],
        'filterStato' => ['except' => ''],
    ];

    public function updatingSearch()
    {
        $this->resetPage();
    }

    public function sortBy(string $field)
    {
        if ($this->sortField === $field) {
            $this->sortDirection = $this->sortDirection === 'asc' ? 'desc' : 'asc';
        } else {
            $this->sortField = $field;
            $this->sortDirection = 'asc';
        }
    }

    public function toggleActive(Territorio $territorio)
    {
        $territorio->update(['attivo' => !$territorio->attivo]);
        activity()->causedBy(auth()->user())
            ->performedOn($territorio)
            ->withProperties(['attivo' => $territorio->attivo])
            ->log($territorio->attivo ? 'activated' : 'deactivated');
    }

    public function togglePriority(Territorio $territorio)
    {
        $territorio->update(['prioritario' => !$territorio->prioritario]);
        activity()->causedBy(auth()->user())
            ->performedOn($territorio)
            ->withProperties(['prioritario' => $territorio->prioritario])
            ->log($territorio->prioritario ? 'set_priority' : 'unset_priority');
    }

    public function deleteTerritorio(Territorio $territorio)
    {
        activity()->causedBy(auth()->user())
            ->performedOn($territorio)
            ->log('soft_deleted');
        $territorio->delete();
        session()->flash('success', "Territorio {$territorio->numero} spostato nel cestino.");
    }

    public function render()
    {
        $query = Territorio::with(['zona', 'tipologia', 'assegnazioneCorrente.proclamatore']);

        if ($this->search) {
            $query->where('numero', 'like', "%{$this->search}%");
        }

        if ($this->filterZona) {
            $query->where('zona_id', $this->filterZona);
        }

        if ($this->filterTipologia) {
            $query->where('tipologia_id', $this->filterTipologia);
        }

        if ($this->filterStato) {
            match ($this->filterStato) {
                'in_reparto' => $query->inReparto(),
                'assegnato' => $query->assegnato(),
                'da_rientrare' => $query->daRientrare(),
                'inattivo' => $query->where('attivo', false),
                default => null,
            };
        }

        $query->orderBy($this->sortField, $this->sortDirection);

        return view('livewire.territori.territorio-index', [
            'territori' => $query->paginate(20),
            'zone' => Zona::attive()->get(),
            'tipologie' => Tipologia::attive()->get(),
        ]);
    }
}
