<?php

namespace App\Services;

use App\Models\CustomerNotification;
use App\Models\NotificationDelivery;
use App\Models\Order;

class NotificationService
{
    public function __construct(private NotificationTransportService $transport) {}

    public function orderCreated(Order $order): void
    {
        $this->notifyOrder($order, 'order_created', 'تم إنشاء طلبك', 'استلمنا طلبك رقم '.$order->order_number.' وسنقوم بمتابعته حتى التسليم.');
    }

    public function paymentConfirmed(Order $order): void
    {
        $this->notifyOrder($order, 'payment_confirmed', 'تم تأكيد الدفع', 'تم تأكيد دفع طلبك رقم '.$order->order_number.'. سنبدأ التنفيذ الآن.');
    }

    public function paymentFailed(Order $order): void
    {
        $this->notifyOrder($order, 'payment_failed', 'فشل الدفع', 'لم يكتمل دفع طلبك رقم '.$order->order_number.'. يمكنك إعادة المحاولة أو اختيار طريقة دفع أخرى.');
    }

    public function fulfillmentCompleted(Order $order): void
    {
        $message = $order->items()->where('delivery_method_snapshot', 'stored_code')->exists()
            ? 'تم تنفيذ طلبك رقم '.$order->order_number.'. الأكواد الرقمية متاحة الآن داخل صفحة الطلب.'
            : 'تم تنفيذ طلبك رقم '.$order->order_number.'. شكراً لاستخدامك RaseedNow.';

        $this->notifyOrder($order, 'fulfillment_completed', 'تم تنفيذ الطلب', $message);
    }

    public function fulfillmentFailed(Order $order, string $reason): void
    {
        $this->notifyOrder($order, 'fulfillment_failed', 'تعذر تنفيذ الطلب', 'تعذر تنفيذ طلبك رقم '.$order->order_number.'. السبب: '.$reason);
    }

    public function infoRequested(Order $order, string $note): void
    {
        $this->notifyOrder($order, 'info_requested', 'نحتاج معلومات إضافية', 'نحتاج معلومات إضافية لتنفيذ طلبك رقم '.$order->order_number.': '.$note);
    }

    private function notifyOrder(Order $order, string $type, string $title, string $body): ?CustomerNotification
    {
        $notification = null;

        if ($order->user_id) {
            $notification = CustomerNotification::create([
                'user_id' => $order->user_id,
                'order_id' => $order->id,
                'type' => $type,
                'title' => $title,
                'body' => $body,
                'data' => [
                    'order_number' => $order->order_number,
                    'order_url' => route('orders.show', $order),
                ],
            ]);
        }

        if ($order->customer_email) {
            $this->delivery($notification, $order, 'email', $order->customer_email, $title, $body);
        }

        if ($order->user?->phone) {
            $this->delivery($notification, $order, 'sms', $order->user->phone, null, $body);
        }

        return $notification;
    }

    private function delivery(?CustomerNotification $notification, Order $order, string $channel, ?string $recipient, ?string $subject, string $body): NotificationDelivery
    {
        $result = $this->transport->send($channel, $recipient, $subject, $body, [
            'type' => $notification?->type,
            'order_id' => $order->id,
            'order_number' => $order->order_number,
        ]);

        return NotificationDelivery::create([
            'customer_notification_id' => $notification?->id,
            'order_id' => $order->id,
            'channel' => $channel,
            'recipient' => $recipient,
            'status' => $result['status'],
            'provider' => $result['provider'],
            'reference' => $result['reference'],
            'subject' => $subject,
            'body' => $body,
            'payload' => $result['payload'],
            'sent_at' => $result['status'] === 'sent' ? now() : null,
        ]);
    }
}
