<?php

namespace App\Console\Commands;

use App\Models\ScheduledNotification;
use Illuminate\Console\Command;

/**
 * Process scheduled notifications (M6: IMPAR timer, delivery reminders).
 * This command should be run every minute via the Laravel scheduler.
 */
class ProcessScheduledNotifications extends Command
{
    protected $signature = 'notifications:process';

    protected $description = 'Process pending scheduled notifications (IMPAR reminders, delivery confirmations)';

    public function handle(): int
    {
        $pendingNotifications = ScheduledNotification::where('activa', true)
            ->whereNull('enviada_en')
            ->where('programada_para', '<=', now())
            ->with('caso')
            ->get();

        $processed = 0;

        foreach ($pendingNotifications as $notification) {
            $caso = $notification->caso;
            if (! $caso) {
                $notification->update(['activa' => false]);

                continue;
            }

            // Check if the IMPAR already responded (cancel remaining reminders)
            if (str_starts_with($notification->tipo, 'impar_reminder') && $caso->recepcion_impar) {
                ScheduledNotification::cancelReminders($caso->id);

                continue;
            }

            // Create the actual notification record on the case
            $mensaje = $this->getMensaje($notification);
            $caso->notificaciones()->create([
                'tipo' => $notification->tipo,
                'mensaje' => $mensaje,
                'data' => $notification->data,
            ]);

            $notification->update([
                'enviada_en' => now(),
                'intentos' => $notification->intentos + 1,
            ]);

            // For IMPAR reminders after 5h: schedule another one in 30 minutes
            if ($notification->tipo === 'impar_reminder_7h' && ! $caso->recepcion_impar) {
                ScheduledNotification::create([
                    'caso_id' => $caso->id,
                    'tipo' => 'impar_reminder_continuo',
                    'programada_para' => now()->addMinutes(30),
                    'activa' => true,
                    'data' => $notification->data,
                ]);
            }

            // For continuous reminders: keep generating every 30 min
            if ($notification->tipo === 'impar_reminder_continuo' && ! $caso->recepcion_impar) {
                ScheduledNotification::create([
                    'caso_id' => $caso->id,
                    'tipo' => 'impar_reminder_continuo',
                    'programada_para' => now()->addMinutes(30),
                    'activa' => true,
                    'data' => $notification->data,
                ]);
            }

            // For delivery reminders: keep sending until confirmed
            if ($notification->tipo === 'entrega_reminder') {
                $cotizacion = $caso->cotizaciones()
                    ->whereNotNull('fecha_entrega_prometida')
                    ->where('entrega_confirmada_taller', false)
                    ->latest()
                    ->first();

                if ($cotizacion && ! $cotizacion->confirmacion_documento_path) {
                    ScheduledNotification::create([
                        'caso_id' => $caso->id,
                        'tipo' => 'entrega_reminder',
                        'programada_para' => now()->addHours(4),
                        'activa' => true,
                        'data' => $notification->data,
                    ]);
                }
            }

            $processed++;
        }

        $this->info("Processed {$processed} scheduled notifications.");

        return Command::SUCCESS;
    }

    private function getMensaje(ScheduledNotification $notification): string
    {
        return match (true) {
            str_starts_with($notification->tipo, 'impar_reminder_4h30') => 'Recordatorio: Faltan 30 minutos para el vencimiento del plazo de cotización IMPAR (caso #'.$notification->caso->numero_reclamo.')',
            str_starts_with($notification->tipo, 'impar_reminder_5h') => '⚠️ URGENTE: Se ha cumplido el plazo de 5 horas para la cotización IMPAR (caso #'.$notification->caso->numero_reclamo.')',
            str_starts_with($notification->tipo, 'impar_reminder') => 'Recordatorio: Aún no se recibe cotización IMPAR para caso #'.$notification->caso->numero_reclamo,
            $notification->tipo === 'entrega_reminder' => 'Recordatorio: Confirme la entrega de repuestos para caso #'.$notification->caso->numero_reclamo.'. Se requiere adjuntar documento de confirmación.',
            default => 'Notificación programada para caso #'.($notification->caso->numero_reclamo ?? $notification->caso_id),
        };
    }
}
