<?php

namespace App\Services\Notifica;

use App\Models\RigaOrdine;
use Illuminate\Support\Facades\Log;
use Kreait\Firebase\Exception\Messaging\NotFound;
use Kreait\Firebase\Exception\MessagingException;
use Kreait\Firebase\Messaging\CloudMessage;
use Kreait\Firebase\Messaging\Notification;
use Kreait\Laravel\Firebase\Facades\Firebase;

class NotificaOrdineService
{
    /**
     * Invia push FCM al cliente che ha registrato il token sull'ordine.
     */
    public function inviaOrdinePronto(RigaOrdine $riga_ordine, ?string $titolo = null, ?string $corpo = null): bool
    {
        $token = $riga_ordine->ordine->fcm_token;

        if (empty($token)) {
            Log::info('[FCM] Skip: ordine senza token', [
                'ordine_id' => $riga_ordine->ordine->id,
            ]);

            return false;
        }

        $riga_ordine->loadMissing(['piatto', 'ordine.attivita']);

        $titolo = $titolo ?? ($riga_ordine->ordine->attivita?->nome ?? 'Ordine').' — Ordine pronto';
        $corpo = $corpo ?? ($riga_ordine->piatto?->nome ?? 'Piatto').' è pronto — ritira al banco';

        $message = CloudMessage::new()
            ->toToken($token)
            ->withNotification(Notification::create($titolo, $corpo))
            ->withData([
                'ordine_id' => (string) $riga_ordine->ordine->id,
            ]);

            Log::info('messaggio creato', [
                'titolo' => $titolo,
                'corpo' => $corpo,
                'ordine_id' => $riga_ordine->ordine->id,
            ]);

        try {
            Firebase::messaging()->send($message);
            Log::info('messaggio inviato', [
                'ordine_id' => $riga_ordine->ordine->id,
            ]);
            return true;
        } catch (NotFound $e) {
            Log::warning('FCM token non valido, rimosso dall\'ordine', [
                'ordine_id' => $riga_ordine->ordine->id,
                'message' => $e->getMessage(),
            ]);
            // $riga_ordine->ordine->fcm_token = null;
            // $riga_ordine->ordine->save();

            return false;
        } catch (MessagingException $e) {
            Log::error('Errore invio notifica FCM ordine', [
                'ordine_id' => $riga_ordine->ordine->id,
                'message' => $e->getMessage(),
            ]);

            return false;
        }
    }
}
