<?php

namespace App\Http\Controllers;

use App\Models\Ajustador;
use App\Models\Caso;
use App\Models\Taller;
use App\Models\TarifaAjustador;
use App\Models\Tenant;
use App\Services\NotificationService;
use Illuminate\Http\Request;
use Inertia\Inertia;

class CoordinacionController extends Controller
{
    public function index(Request $request)
    {
        // Obtener todos los estados válidos para la pantalla de coordinación
        $estadosCoordinacion = array_merge(
            ['pendiente_coordinacion'],
            [
                'coordinado',
                'recoordinacion',
                'no_contesta',
                'llamar_despues',
                'pendiente_respuesta_ejecutivo',
                'pendiente_proforma_cliente',
                'pendiente_proforma_taller',
                'pendiente_aviso_siniestro',
                'vehiculo_retenido',
                'vehiculo_circulando',
                'vehiculo_no_taller',
            ]
        );

        $query = Caso::with(['aseguradora', 'cliente', 'vehiculo', 'taller', 'broker', 'ajustador'])
            ->whereIn('estado_actual', $estadosCoordinacion);

        if ($request->search) {
            $query->where(function ($q) use ($request) {
                $q->whereHas('vehiculo', function ($vq) use ($request) {
                    $vq->where('placa', 'like', '%'.$request->search.'%');
                })->orWhere('numero_reclamo', 'like', '%'.$request->search.'%');
            });
        }

        $casos = $query->orderBy('created_at', 'desc')
            ->get()
            ->groupBy('aseguradora_id');

        $aseguradoras = Tenant::all();

        return Inertia::render('Coordinacion/Index', [
            'title' => 'Coordinación de Casos',
            'casosPorAseguradora' => $casos,
            'aseguradoras' => $aseguradoras,
            'estados' => Caso::ESTADOS,
        ]);
    }

    public function ruta(Caso $caso)
    {
        $caso->load(['aseguradora', 'cliente', 'vehiculo', 'taller']);

        // Normalizar aviso_siniestro_path a array
        $paths = $caso->aviso_siniestro_path;
        if (is_string($paths)) {
            $decoded = json_decode($paths, true);
            $caso->aviso_siniestro_path = is_array($decoded) ? $decoded : [];
        } elseif (! is_array($paths)) {
            $caso->aviso_siniestro_path = [];
        }

        return Inertia::render('Coordinacion/Ruta', [
            'title' => 'Asignación de Ruta',
            'caso' => $caso,
            'ajustadores' => Ajustador::all(),
            'talleres' => Taller::all(),
            'estados' => Caso::ESTADOS,
        ]);
    }

    public function imprimir(Caso $caso)
    {
        $caso->load(['aseguradora', 'cliente', 'vehiculo', 'taller', 'ajustador', 'broker']);

        // Normalizar aviso_siniestro_path a array
        $paths = $caso->aviso_siniestro_path;
        if (is_string($paths)) {
            $decoded = json_decode($paths, true);
            $caso->aviso_siniestro_path = is_array($decoded) ? $decoded : [];
        } elseif (! is_array($paths)) {
            $caso->aviso_siniestro_path = [];
        }

        return Inertia::render('Coordinacion/PrintRuta', [
            'title' => 'Hoja de Ruta - '.$caso->numero_reclamo,
            'caso' => $caso,
        ]);
    }

    public function asignar(Request $request, Caso $caso)
    {
        $request->validate([
            'ajustador_id' => 'required|exists:ajustadores,id',
            'tipo_ajuste' => 'required',
            'sub_tipo_ajuste' => 'nullable|string',
            'tarifa_ajustador_tipo' => 'required',
            'ubicacion_vehiculo' => 'required',
            'ubicacion_otro' => 'nullable|string|max:255',
            'fecha_inspeccion' => 'nullable|date',
            'direccion_inspeccion' => 'nullable|string|max:500',
            'lat_inspeccion' => 'nullable|numeric|between:-90,90',
            'lng_inspeccion' => 'nullable|numeric|between:-180,180',
        ]);

        // Auto-calculate tariff from ajustador + vehicle type (M3 PPTX)
        $tarifa = TarifaAjustador::where('ajustador_id', $request->ajustador_id)
            ->where('tipo_vehiculo', $request->tarifa_ajustador_tipo)
            ->where('activo', true)
            ->first();

        // PPTX rule: repetir/mal_realizado → tarifa = $0
        $tarifaAjuste = $tarifa ? $tarifa->valor : 0;
        if (in_array($request->tipo_ajuste, ['repetir', 'mal_realizado'])) {
            $tarifaAjuste = 0;
        }

        $caso->update([
            'ajustador_id' => $request->ajustador_id,
            'tipo_ajuste' => $request->tipo_ajuste,
            'sub_tipo_ajuste' => $request->sub_tipo_ajuste,
            'tarifa_ajustador_tipo' => $request->tarifa_ajustador_tipo,
            'tarifa_ajustador_valor' => $request->tarifa_ajustador_valor ?? $tarifaAjuste,
            'ubicacion_vehiculo' => $request->ubicacion_vehiculo,
            'kilometros' => $request->kilometros ?? 0,
            'tarifa_kilometro' => $request->tarifa_kilometro ?? 0,
            'valor_kilometraje' => ($request->kilometros ?? 0) * ($request->tarifa_kilometro ?? 0),
            'observaciones' => $request->observaciones,
            'estado_actual' => $request->estado_actual ?? 'coordinado',
            'fecha_asignacion' => now(),
            'fecha_inspeccion' => $request->fecha_inspeccion,
            'direccion_inspeccion' => $request->direccion_inspeccion,
            'lat_inspeccion' => $request->lat_inspeccion,
            'lng_inspeccion' => $request->lng_inspeccion,
        ]);

        // Crear registro en historial de estados
        $caso->estadosHistoricos()->create([
            'estado' => 'coordinado',
            'nota' => 'Caso asignado a ajustador: '.$caso->ajustador->nombre,
        ]);

        // Notificar asignación al ajustador
        NotificationService::notify($caso, 'caso_asignado', "Tienes un nuevo caso asignado: {$caso->numero_reclamo}", [], $caso->ajustador_id);

        return redirect()->route('coordinacion')->with('message', 'Ruta asignada exitosamente');
    }
}
