<?php

namespace App\Livewire\CasosPrejuridicos;

use App\Models\CasoPrejuridico;
use App\Models\GestionPrejudicial;
use Livewire\Component;

class RegistroGestion extends Component
{
    public CasoPrejuridico $caso;

    public string $canal = '';
    public string $resultado = '';
    public string $observaciones = '';
    public ?string $proximoContactoAt = null;
    public bool $contactoDirecto = false;
    public ?int $duracionMinutos = null;

    protected function rules(): array
    {
        return [
            'canal' => 'required|in:' . implode(',', array_keys(GestionPrejudicial::CANALES)),
            'resultado' => 'required|in:' . implode(',', array_keys(GestionPrejudicial::RESULTADOS)),
            'observaciones' => 'required|string|min:5|max:1000',
            'proximoContactoAt' => 'nullable|date|after_or_equal:today',
            'contactoDirecto' => 'boolean',
            'duracionMinutos' => 'nullable|integer|min:0|max:600',
        ];
    }

    protected $messages = [
        'canal.required' => 'Debes seleccionar un canal.',
        'resultado.required' => 'Debes seleccionar un resultado.',
        'observaciones.required' => 'Las observaciones son obligatorias.',
        'observaciones.min' => 'Las observaciones deben tener al menos 5 caracteres.',
        'proximoContactoAt.after_or_equal' => 'La próxima gestión no puede ser en el pasado.',
    ];

    public function mount(CasoPrejuridico $caso): void
    {
        $this->caso = $caso;
    }

    public function guardar(): void
    {
        $this->validate();

        GestionPrejudicial::create([
            'caso_prejuridico_id' => $this->caso->id,
            'user_id' => auth()->id(),
            'fecha_gestion' => now(),
            'canal' => $this->canal,
            'resultado' => $this->resultado,
            'observaciones' => $this->observaciones,
            'proximo_contacto_at' => $this->proximoContactoAt,
            'contacto_directo' => $this->contactoDirecto,
            'duracion_minutos' => $this->duracionMinutos,
        ]);

        session()->flash('mensajeGestion', 'Gestión registrada correctamente.');
        $this->reset(['canal', 'resultado', 'observaciones', 'proximoContactoAt', 'contactoDirecto', 'duracionMinutos']);
    }

    public function eliminar(int $gestionId): void
    {
        $gestion = GestionPrejudicial::where('id', $gestionId)
            ->where('caso_prejuridico_id', $this->caso->id)
            ->first();

        if ($gestion) {
            $gestion->delete();
            session()->flash('mensajeGestion', 'Gestión eliminada (movida a papelera).');
        }
    }

    public function render()
    {
        $gestiones = GestionPrejudicial::with('user')
            ->where('caso_prejuridico_id', $this->caso->id)
            ->orderByDesc('fecha_gestion')
            ->get();

        return view('livewire.casos-prejuridicos.registro-gestion', [
            'gestiones' => $gestiones,
            'canales' => GestionPrejudicial::CANALES,
            'resultados' => GestionPrejudicial::RESULTADOS,
        ]);
    }
}
