<?php

namespace App\Http\Controllers;

use App\Models\Caso;
use App\Models\Cotizacion;
use App\Models\DocumentoLog;
use App\Models\PersonalZurich;
use App\Models\Proveedor;
use App\Models\ScheduledNotification;
use App\Services\NotificationService;
use Illuminate\Http\Request;
use Inertia\Inertia;

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

        // 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;

        // Filter by plate, claim number, client name, vehicle details, or workshop
        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.'%');
                    });
            });
        }

        // Filter by 'all' or default to 'mesa_compras'
        if (! $request->all_states) {
            $query->where('estado_actual', 'mesa_compras');
        }

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

        return Inertia::render('MesaCompras/Index', [
            'title' => 'Mesa de Compras - Búsqueda',
            'casos' => $casos,
            'filters' => $request->only(['search']),
        ]);
    }

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

        return Inertia::render('MesaCompras/Show', [
            'title' => 'Seguimiento Mesa de Compras - Caso '.($caso->numero_reclamo ?? $caso->id),
            'caso' => $caso,
            'proveedores' => Proveedor::all(),
            'ejecutivos' => PersonalZurich::whereIn('cargo', ['Ejecutivo', 'Ejecutivo Mesa de Compras'])->get(),
            'directores' => PersonalZurich::where('cargo', 'Director')->get(),
            'reinspectores' => PersonalZurich::where('cargo', 'Reinspector')->get(),
        ]);
    }

    public function notificar(Request $request, Caso $caso)
    {
        $request->validate([
            'tipo' => 'required|in:stock,importacion',
            'notificar_a' => 'required|array',
        ]);

        // For importación: generate external approval token (M6 PPTX)
        $approvalUrl = null;
        if ($request->tipo === 'importacion') {
            $token = AprobacionController::generarToken($caso);
            $approvalUrl = route('aprobacion.show', $token);
        }

        NotificationService::notify($caso, 'procurement_'.$request->tipo, 'Solicitud de aceptación de '.$request->tipo.' enviada.', [
            'notificar_a' => $request->notificar_a,
            'link_aprobacion' => $approvalUrl,
        ]);

        return back()->with('message', 'Notificación enviada correctamente'.($approvalUrl ? '. Link de aprobación generado.' : ''));
    }

    public function grabar(Request $request, Caso $caso)
    {
        $request->validate([
            'proveedor_id' => 'required|exists:proveedores,id',
            'tipo_compra' => 'required',
            'tipo_compra_taller' => 'nullable|in:dealer,multimarca,dealer_multimarca,multimarca_dealer,taller_asegurado',
            'ejecutivo_id' => 'required',
            'director_id' => 'nullable|exists:personal_zurich,id',
            'reinspector_id' => 'nullable|exists:personal_zurich,id',
            'items' => 'required|array|min:1',
            'items.*.repuesto' => 'required|string',
            'items.*.cantidad' => 'required|integer|min:1',
        ]);

        $caso->update([
            'ejecutivo_id' => $request->ejecutivo_id,
            'director_id' => $request->director_id,
            'reinspector_id' => $request->reinspector_id,
            'tipo_compra_taller' => $request->tipo_compra_taller,
            'estado_actual' => 'mesa_compras', // Ensure it stays in this state or moves correctly
        ]);

        $cotizacion = Cotizacion::create([
            'caso_id' => $caso->id,
            'proveedor_id' => $request->proveedor_id,
            'tipo' => $request->tipo_compra,
            'estado' => 'pendiente',
            'fecha_envio' => now(),
            'fecha_limite' => now()->addHours(5),
            'fecha_entrega_prometida' => $request->fecha_entrega ?? null,
            'observaciones' => $request->observaciones,
        ]);

        // Save items
        foreach ($request->items as $item) {
            $cotizacion->items()->create([
                'repuesto' => $item['repuesto'],
                'cantidad' => $item['cantidad'],
                'precio_unitario' => $item['precio_unitario'] ?? 0,
                'subtotal' => ($item['cantidad'] ?? 1) * ($item['precio_unitario'] ?? 0),
            ]);
        }

        // Schedule IMPAR reminder chain (M6: 4h30m, 5h, every 30min)
        ScheduledNotification::scheduleImparReminders($caso->id, [
            'cotizacion_id' => $cotizacion->id,
            'proveedor_id' => $request->proveedor_id,
        ]);

        // If delivery date provided, schedule day-before reminder
        if ($request->fecha_entrega) {
            ScheduledNotification::scheduleEntregaReminder($caso->id, $request->fecha_entrega, [
                'cotizacion_id' => $cotizacion->id,
                'proveedor_id' => $request->proveedor_id,
            ]);
        }

        NotificationService::notify($caso, 'compra_guardada', 'Datos de compra y repuestos registrados para caso '.$caso->numero_reclamo, [
            'proveedor_id' => $request->proveedor_id,
            'monto' => $cotizacion->monto,
        ]);

        return back()->with('message', 'Datos de compra guardados. Timer de 5 horas iniciado.');
    }

    public function recotizar(Request $request, Caso $caso)
    {
        $request->validate([
            'proveedor_id' => 'required|exists:proveedores,id',
            'tipo_compra' => 'required|in:stock,importacion',
            'nueva_cotizacion' => 'required|numeric|min:0',
            'observaciones' => 'nullable|string',
        ]);

        $nuevaCotizacion = Cotizacion::create([
            'caso_id' => $caso->id,
            'proveedor_id' => $request->proveedor_id,
            'tipo' => $request->tipo_compra,
            'estado' => 'recotizacion',
            'monto' => $request->nueva_cotizacion,
            'observaciones' => $request->observaciones.' (Recotización)',
        ]);

        NotificationService::notify($caso, 'recotizacion', 'Nueva cotización registrada para caso '.$caso->numero_reclamo, [
            'cotizacion_id' => $nuevaCotizacion->id,
            'monto' => $request->nueva_cotizacion,
        ]);

        return back()->with('message', 'Recotización registrada correctamente');
    }

    public function generarCuadroComparativo(Caso $caso)
    {
        $cotizaciones = Cotizacion::where('caso_id', $caso->id)
            ->with('proveedor')
            ->orderBy('monto', 'asc')
            ->get();

        DocumentoLog::log($caso->id, 'cuadro_comparativo', null, 'visto');

        return response()->json([
            'caso' => $caso->numero_reclamo,
            'cotizaciones' => $cotizaciones,
            'recomendada' => $cotizaciones->first(),
        ]);
    }

    public function uploadCuadroComparativo(Request $request, Caso $caso)
    {
        $request->validate([
            'cuadro_comparativo' => 'required|file|mimes:pdf,xls,xlsx,doc,docx,jpg,jpeg,png|max:10240',
        ]);

        if ($request->hasFile('cuadro_comparativo')) {
            $file = $request->file('cuadro_comparativo');
            $filename = 'cuadro_'.$caso->id.'_'.time().'.'.$file->getClientOriginalExtension();
            $path = $file->storeAs('cuadros_comparativos', $filename, 'public');

            $caso->update([
                'cuadro_comparativo_path' => $path,
                'recepcion_impar' => true,
            ]);

            return back()->with('message', 'Cuadro comparativo cargado correctamente');
        }

        return back()->with('error', 'Error al cargar el archivo');
    }

    public function rechazarImpar(Caso $caso)
    {
        $caso->update([
            'recepcion_impar' => false,
        ]);

        NotificationService::notify($caso, 'rechazo_impar', 'No se recibió cotización Impar y se trabajará directamente con los valores del taller.', [
            'taller_id' => $caso->taller_id,
        ]);

        return back()->with('message', 'Notificación de rechazo IMPAR resgistrada');
    }

    public function enviarAprobacion(Caso $caso)
    {
        if (! $caso->cuadro_comparativo_path) {
            return back()->with('error', 'Debe cargar el cuadro comparativo antes de enviarlo a aprobación');
        }

        NotificationService::notify($caso, 'aprobacion_cuadro', 'Se ha enviado el cuadro comparativo para la aprobación del ejecutivo y reinspector (Caso: '.$caso->numero_reclamo.')', [
            'cuadro_path' => $caso->cuadro_comparativo_path,
            'ejecutivo_id' => $caso->ejecutivo_id,
            'reinspector_id' => $caso->reinspector_id,
        ]);

        return back()->with('message', 'Cuadro comparativo enviado exitosamente a Ejecutivo y Reinspector');
    }
}
