<?php

namespace App\Services\Notifications;

use App\Models\Central\Company;
use App\Models\Tenant\Client;
use App\Models\Tenant\OnlineOrder;
use App\Models\Tenant\User;

/**
 * Notifies staff of a new online order (Web Push) and confirms to the customer
 * via Telegram if they have a linked chat. Best-effort — never throws.
 */
class ShopOrderNotifier
{
    public function __construct(
        private WebPushService $push,
        private TelegramService $telegram,
    ) {
    }

    public function placed(OnlineOrder $order): void
    {
        $company = Company::withoutGlobalScopes()->find($order->company_id);
        if (! $company) return;

        // ── Staff: Web Push to active users of this tenant ──
        $title = 'Comandă nouă #' . $order->number;
        $body = $order->customer_name . ' · ' . number_format((float) $order->total, 2) . ' '
            . ($company->settings['currency'] ?? 'MDL');
        $url = '/app/resources/online-orders/' . $order->id . '/edit';

        $userIds = User::where('status', 'active')->pluck('id');
        foreach ($userIds as $uid) {
            $this->push->sendToUser((int) $uid, $title, $body, $url, 'shop-order-' . $order->id);
        }

        // ── Customer: Telegram if their phone is linked ──
        $needle = Client::normalizePhone($order->customer_phone);
        if ($needle) {
            $client = Client::whereNotNull('telegram_chat_id')
                ->whereRaw(
                    "REPLACE(REPLACE(REPLACE(REPLACE(phone, ' ', ''), '-', ''), '(', ''), ')', '') LIKE ?",
                    ['%' . substr($needle, -9) . '%']
                )
                ->first();

            if ($client && $client->telegram_chat_id) {
                $brand = htmlspecialchars($company->display_name ?? $company->name);
                $text = "🛒 <b>Comanda #{$order->number} primită</b>\n"
                    . "Total: <b>" . number_format((float) $order->total, 2) . " "
                    . ($company->settings['currency'] ?? 'MDL') . "</b>\n\n"
                    . "Urmărește statusul: " . $order->trackingUrl() . "\n\n{$brand}";
                $this->telegram->sendMessage($company, (string) $client->telegram_chat_id, $text);
            }
        }

        // ── Customer: email confirmation when address given ──
        if ($order->customer_email) {
            try {
                \Illuminate\Support\Facades\Mail::to($order->customer_email)
                    ->send(new \App\Mail\ShopOrderConfirmationMail($order, $company));
            } catch (\Throwable $e) {
                \Illuminate\Support\Facades\Log::warning('shop order confirmation mail failed', [
                    'order' => $order->id, 'err' => $e->getMessage(),
                ]);
            }
        }
    }
}
