<?php

namespace App\Http\Controllers;

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

class ReparacionController extends Controller
{
    public function index(Request $request)
    {
        $query = Caso::with(['aseguradora', 'cliente', 'vehiculo', 'taller', 'seguimientoReparacion']);

        // Scope by user tenant if not admin (Slide 6 & Single-database tenancy)
        $user = $request->user();
        if ($user && $user->rol !== 'admin' && $user->tenant_id) {
            $query->where('tenant_id', $user->tenant_id);
        }

        $searchTerm = $request->input('search') ? trim($request->input('search')) : null;

        if ($searchTerm) {
            $query->where(function ($q) use ($searchTerm) {
                $q->where('numero_reclamo', 'like', '%'.$searchTerm.'%')
                    ->orWhereHas('vehiculo', function ($q2) use ($searchTerm) {
                        $q2->where('placa', 'like', '%'.$searchTerm.'%')
                            ->orWhere('marca', 'like', '%'.$searchTerm.'%')
                            ->orWhere('modelo', 'like', '%'.$searchTerm.'%');
                    })
                    ->orWhereHas('cliente', function ($q2) use ($searchTerm) {
                        $q2->where('nombre', 'like', '%'.$searchTerm.'%');
                    })
                    ->orWhereHas('taller', function ($q2) use ($searchTerm) {
                        $q2->where('razon_social', 'like', '%'.$searchTerm.'%');
                    });
            });
        } else {
            // Default: only cases in 'en_reparacion' state or with existing repair tracking
            $query->where(function ($q) {
                $q->where('estado_actual', 'en_reparacion')
                    ->orWhereHas('seguimientoReparacion');
            });
        }

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

        return Inertia::render('Reparacion/Index', [
            'title' => 'Seguimiento Reparación - Búsqueda',
            'casos' => $casos,
            'filters' => $request->only(['search']),
        ]);
    }

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

        return Inertia::render('Reparacion/Show', [
            'title' => 'Seguimiento Reparación - Caso '.($caso->numero_reclamo ?? $caso->id),
            'caso' => $caso,
        ]);
    }

    public function update(Request $request, Caso $caso)
    {
        $request->validate([
            'nivel_dano' => 'required|string',
            'vehiculo_ingresado' => 'required|boolean',
            'tipo_trabajo' => 'nullable|array',
            'sub_estado' => 'nullable|string',
            'fecha_salida_taller' => 'nullable|date',
        ]);

        $nivelDano = strtolower($request->nivel_dano);
        if (! in_array($nivelDano, ['alta', 'media', 'baja'])) {
            return back()->withErrors(['nivel_dano' => 'El nivel de daño es inválido.']);
        }

        // PPTX M7: If 'alcance' selected → return to Coordinación (M2) as ALCANCE
        $esAlcance = is_array($request->tipo_trabajo) && in_array('alcance', $request->tipo_trabajo);

        $seguimiento = $caso->seguimientoReparacion()->updateOrCreate(
            ['caso_id' => $caso->id],
            [
                'nivel_dano' => $nivelDano,
                'vehiculo_ingresado' => $request->vehiculo_ingresado,
                'fecha_ingreso_taller' => $request->vehiculo_ingresado ? ($caso->seguimientoReparacion?->fecha_ingreso_taller ?? now()) : null,
                'fecha_salida_taller' => $request->fecha_salida_taller,
                'tipo_trabajo' => $request->tipo_trabajo,
                'sub_estado' => $request->sub_estado,
                'es_alcance' => $esAlcance,
                'observaciones' => $request->observaciones,
            ]
        );

        if ($esAlcance) {
            // Auto-transition to Coordinación with ALCANCE state
            $caso->update(['estado_actual' => 'alcance']);
            $caso->estadosHistoricos()->create([
                'estado' => 'alcance',
                'nota' => 'Vehículo requiere alcance. Retorna a coordinación.',
            ]);
            NotificationService::notify($caso, 'alcance_reparacion', 'Caso '.$caso->numero_reclamo.' regresa a coordinación como ALCANCE.');

            return back()->with('message', 'Caso marcado como ALCANCE. Regresa a coordinación.');
        }

        // Notify when vehicle is NOT yet in the shop
        if (! $request->vehiculo_ingresado) {
            NotificationService::notify($caso, 'vehiculo_no_ingresado', 'Vehículo aún no ingresado a taller para caso '.$caso->numero_reclamo);
        }

        return back()->with('message', 'Seguimiento de reparación actualizado');
    }

    public function ordenSalida(Caso $caso)
    {
        // Logic to finalize repair and allow exit
        $caso->update(['estado_actual' => 'finalizado']);

        NotificationService::notify($caso, 'orden_salida', 'Orden de salida generada para el vehículo '.$caso->vehiculo->placa);

        return back()->with('message', 'Orden de salida generada exitosamente');
    }

    public function subirPrefactura(Request $request, Caso $caso)
    {
        $request->validate([
            'prefactura_numero' => 'required|string',
            'prefactura_monto' => 'required|numeric|min:0',
            'prefactura_archivo' => 'nullable|file|mimes:pdf,jpg,jpeg,png,xlsx,xls',
        ]);

        $prefacturaPath = null;
        if ($request->hasFile('prefactura_archivo')) {
            $prefacturaPath = $request->file('prefactura_archivo')->store('prefacturas/'.$caso->id, 'public');
        }

        $seguimiento = $caso->seguimientoReparacion()->updateOrCreate(
            ['caso_id' => $caso->id],
            [
                'prefactura_numero' => $request->prefactura_numero,
                'prefactura_monto' => $request->prefactura_monto,
                'prefactura_path' => $prefacturaPath,
            ]
        );

        NotificationService::notify($caso, 'prefactura_subida', 'Prefactura #'.$request->prefactura_numero.' registrada para caso '.$caso->numero_reclamo, [
            'numero' => $request->prefactura_numero,
            'monto' => $request->prefactura_monto,
        ]);

        return back()->with('message', 'Prefactura subida correctamente');
    }

    public function generarOrdenSalida(Request $request, Caso $caso)
    {
        $request->validate([
            'orden_salida_numero' => 'required|string',
        ]);

        $seguimiento = $caso->seguimientoReparacion()->updateOrCreate(
            ['caso_id' => $caso->id],
            [
                'orden_salida_numero' => $request->orden_salida_numero,
                'orden_salida_fecha' => now(),
                'fecha_salida_taller' => now(),
            ]
        );

        $caso->update(['estado_actual' => 'ajuste_finalizado']);

        NotificationService::notify($caso, 'orden_salida_generada', 'Orden de salida #'.$request->orden_salida_numero.' generada para vehículo '.$caso->vehiculo->placa);

        return back()->with('message', 'Orden de salida generada correctamente');
    }

    public function actualizarSIAS(Request $request, Caso $caso)
    {
        $request->validate([
            'numero_sias' => 'nullable|string',
            'numero_audatex' => 'nullable|string',
            'estado_sias' => 'nullable|string',
        ]);

        $caso->update([
            'numero_caso_sias' => $request->numero_sias ?? $caso->numero_caso_sias,
            'link_fotos' => $request->link_fotos ?? $caso->link_fotos,
        ]);

        NotificationService::notify($caso, 'sias_actualizado', 'Caso actualizado en sistema SIAS/Audatex', [
            'numero_sias' => $request->numero_sias,
            'numero_audatex' => $request->numero_audatex,
            'estado_sias' => $request->estado_sias,
        ]);

        return back()->with('message', 'SIAS/Audatex actualizado correctamente');
    }
}
