<?php
declare(strict_types=1);

namespace Celena\Plugin\Leads\Support;

use Celena\Core\Mail\Mailer;
use Celena\Module\Settings\Options;

/**
 * Уведомления о новой заявке: email (по списку из настроек формы) + Telegram.
 * Обобщает прежний LeadsController::notify на произвольный набор полей.
 */
final class FormNotifier
{
    public function __construct(
        private readonly Mailer $mailer,
        private readonly Options $options,
    ) {
    }

    /**
     * @param array<string,mixed> $form  запись формы (fields + settings)
     * @param array<string,string> $data значения {label => value} уже подготовлены вызывающим
     */
    public function notify(array $form, array $rows): void
    {
        $settings = is_array($form['settings'] ?? null) ? $form['settings'] : [];
        $title    = (string) ($form['title'] ?? 'Form');

        // Email
        $html = '<h2 style="font-family:Arial,sans-serif;color:#0b1320">New submission — ' . htmlspecialchars($title, ENT_QUOTES, 'UTF-8') . '</h2>'
              . '<table style="font-family:Arial,sans-serif;font-size:15px;color:#0b1320;border-collapse:collapse">';
        foreach ($rows as $k => $v) {
            $html .= '<tr><td style="padding:6px 14px 6px 0;color:#7a8aa0">' . htmlspecialchars((string) $k, ENT_QUOTES, 'UTF-8') . '</td>'
                  . '<td style="padding:6px 0"><b>' . htmlspecialchars($v !== '' ? (string) $v : '—', ENT_QUOTES, 'UTF-8') . '</b></td></tr>';
        }
        $html .= '</table>';

        $emails = $settings['notify_emails'] ?? [];
        if (!is_array($emails) || $emails === []) {
            // Некуда слать — заявка всё равно сохранена в БД и видна в админке.
            $emails = array_filter([trim((string) $this->options->get('site_email', ''))]);
        }
        $subjectName = '';
        foreach ($rows as $v) { if (trim((string) $v) !== '') { $subjectName = (string) $v; break; } }
        foreach ($emails as $to) {
            $to = trim((string) $to);
            if ($to !== '' && filter_var($to, FILTER_VALIDATE_EMAIL)) {
                $this->mailer->send($to, 'New lead: ' . ($subjectName !== '' ? $subjectName : $title), $html);
            }
        }

        // Telegram (если включён в форме и заданы креды в настройках сайта)
        if (!empty($settings['telegram_enabled'])) {
            $token  = (string) $this->options->get('telegram_bot_token', '');
            $chatId = (string) $this->options->get('telegram_chat_id', '');
            if ($token !== '' && $chatId !== '' && function_exists('curl_init')) {
                $text = 'New lead — ' . $title . " (celena.io)\n";
                foreach ($rows as $k => $v) {
                    if (trim((string) $v) !== '') {
                        $text .= $k . ': ' . $v . "\n";
                    }
                }
                $ch = curl_init('https://api.telegram.org/bot' . $token . '/sendMessage');
                curl_setopt_array($ch, [
                    CURLOPT_POST           => true,
                    CURLOPT_POSTFIELDS     => http_build_query(['chat_id' => $chatId, 'text' => $text, 'disable_web_page_preview' => 1]),
                    CURLOPT_RETURNTRANSFER => true,
                    CURLOPT_TIMEOUT        => 6,
                ]);
                curl_exec($ch);
                curl_close($ch);
            }
        }
    }
}
