<?php

namespace App\Http\Controllers;

use App\Models\Caso;
use App\Models\DocumentoLog;
use App\Models\Tenant;
use App\Services\NotificationService;
use Illuminate\Http\Request;
use Inertia\Inertia;

class PortalAseguradoraController extends Controller
{
    public function login()
    {
        return Inertia::render('Portal/Login', [
            'title' => 'Portal Aseguradora - Login',
        ]);
    }

    public function authenticate(Request $request)
    {
        $request->validate([
            'ruc' => 'required|string',
            'codigo_acceso' => 'required|string',
        ]);

        $aseguradora = Tenant::where('ruc', $request->ruc)
            ->where('codigo_portal', $request->codigo_acceso)
            ->first();

        if (! $aseguradora) {
            return back()->withErrors(['ruc' => 'Credenciales incorrectas']);
        }

        session(['aseguradora_id' => $aseguradora->id, 'portal' => true]);

        return redirect()->route('portal.dashboard');
    }

    public function dashboard(Request $request)
    {
        $aseguradoraId = session('aseguradora_id');

        if (! $aseguradoraId) {
            return redirect()->route('portal.login');
        }

        $query = Caso::with(['cliente', 'vehiculo'])
            ->where('aseguradora_id', $aseguradoraId);

        $stats = [
            'total' => $query->count(),
            'pendientes' => $query->whereIn('estado_actual', [
                'pendiente_coordinacion',
                'coordinado',
                'caso_en_ruta',
            ])->count(),
            'en_proceso' => $query->whereIn('estado_actual', [
                'analisis',
                'inspeccion_realizada',
                'elaboracion_informe',
                'confirmacion_cobertura',
                'mesa_compras',
                'en_reparacion',
            ])->count(),
            'finalizados' => $query->where('estado_actual', 'finalizado')->count(),
        ];

        $casosRecientes = $query->orderBy('updated_at', 'desc')->limit(10)->get();

        return Inertia::render('Portal/Dashboard', [
            'title' => 'Portal Aseguradora - Dashboard',
            'stats' => $stats,
            'casosRecientes' => $casosRecientes,
        ]);
    }

    public function casos(Request $request)
    {
        $aseguradoraId = session('aseguradora_id');

        if (! $aseguradoraId) {
            return redirect()->route('portal.login');
        }

        $query = Caso::with(['cliente', 'vehiculo'])
            ->where('aseguradora_id', $aseguradoraId);

        if ($request->search) {
            $query->where(function ($q) use ($request) {
                $q->where('numero_reclamo', 'like', "%{$request->search}%")
                    ->orWhereHas('vehiculo', fn ($v) => $v->where('placa', 'like', "%{$request->search}%"))
                    ->orWhereHas('cliente', fn ($c) => $c->where('nombre', 'like', "%{$request->search}%"));
            });
        }

        if ($request->estado) {
            $query->where('estado_actual', $request->estado);
        }

        $casos = $query->orderBy('updated_at', 'desc')->paginate(20);

        return Inertia::render('Portal/Casos', [
            'title' => 'Portal Aseguradora - Casos',
            'casos' => $casos,
            'estados' => Caso::ESTADOS,
            'filtros' => $request->only(['search', 'estado']),
        ]);
    }

    public function verCaso(Caso $caso)
    {
        $aseguradoraId = session('aseguradora_id');

        if (! $aseguradoraId || $caso->aseguradora_id != $aseguradoraId) {
            return redirect()->route('portal.login');
        }

        $caso->load([
            'cliente',
            'vehiculo',
            'estadosHistoricos',
            'ajustador',
            'taller',
            'notificaciones',
        ]);

        return Inertia::render('Portal/VerCaso', [
            'title' => 'Caso '.$caso->numero_reclamo,
            'caso' => $caso,
            'estados' => Caso::ESTADOS,
        ]);
    }

    public function timeline(Caso $caso)
    {
        $aseguradoraId = session('aseguradora_id');

        if (! $aseguradoraId || $caso->aseguradora_id != $aseguradoraId) {
            return redirect()->route('portal.login');
        }

        $caso->load([
            'estadosHistoricos' => function ($q) {
                $q->orderBy('fecha_ingreso', 'asc');
            },
        ]);

        return Inertia::render('Portal/Timeline', [
            'title' => 'Línea de Tiempo - Caso '.$caso->numero_reclamo,
            'caso' => $caso,
        ]);
    }

    public function fotos(Caso $caso)
    {
        $aseguradoraId = session('aseguradora_id');

        if (! $aseguradoraId || $caso->aseguradora_id != $aseguradoraId) {
            return redirect()->route('portal.login');
        }

        DocumentoLog::log($caso->id, 'fotos', $caso->link_fotos, 'visto');

        return Inertia::render('Portal/Fotos', [
            'title' => 'Fotos - Caso '.$caso->numero_reclamo,
            'caso' => $caso,
            'linkFotos' => $caso->link_fotos,
        ]);
    }

    public function informe(Caso $caso)
    {
        $aseguradoraId = session('aseguradora_id');

        if (! $aseguradoraId || $caso->aseguradora_id != $aseguradoraId) {
            return redirect()->route('portal.login');
        }

        DocumentoLog::log($caso->id, 'informe', $caso->link_informe, 'visto');

        return Inertia::render('Portal/Informe', [
            'title' => 'Informe - Caso '.$caso->numero_reclamo,
            'caso' => $caso,
            'linkInforme' => $caso->link_informe,
        ]);
    }

    public function casoNoEncontrado(Request $request)
    {
        $request->validate([
            'numero_reclamo' => 'required|string',
            'email' => 'required|email',
            'mensaje' => 'required|string',
        ]);

        $caso = Caso::where('numero_reclamo', $request->numero_reclamo)->first();

        if ($caso) {
            NotificationService::notify($caso, 'alerta_caso_no_encontrado', 'Cliente reporta caso no encontrado. Email: '.$request->email, [
                'mensaje_cliente' => $request->mensaje,
            ]);
        }

        return back()->with('message', 'Hemos recibido su reporte. Nos contactaremos pronto.');
    }

    public function logout()
    {
        session()->forget(['aseguradora_id', 'portal']);

        return redirect()->route('portal.login');
    }
}
