<?php
declare(strict_types=1);

/**
 * Плагин Leads — конструктор форм. Точка входа.
 * Регистрирует приём заявок (дефолтной и произвольных форм), админ-конструктор,
 * инъекцию формы лендинга и уведомление в колокольчик.
 */

use Celena\Core\Http\Router;
use Celena\Core\Kernel;
use Celena\Core\Database\Connection;
use Celena\Plugin\Leads\Controllers\LeadsController;
use Celena\Plugin\Leads\Controllers\FormsPublicController;
use Celena\Plugin\Leads\Repositories\FormRepository;
use Celena\Plugin\Leads\Support\FormRenderer;

$container = Kernel::container();

// Идемпотентный прогон миграций (cl_leads + cl_forms + cl_form_submissions + сид).
try {
    $dir = __DIR__ . '/migrations';
    if (is_dir($dir)) {
        $runner = new \Celena\Core\Database\MigrationRunner(
            $container->make(Connection::class),
            $container->make(\Celena\Core\Logger::class),
        );
        $runner->run($dir);
    }
} catch (\Throwable) {
}

/** @var Router $router */
$router = $container->make(Router::class);

// Приём заявок (fetch JSON + X-CSRF-Token).
$router->post('/api/leads/submit', LeadsController::class . '@submit');
$router->post('/api/forms/{slug:[a-z0-9\-]+}/submit', FormsPublicController::class . '@submit');

// Отдельная страница формы (для встраивания ссылкой).
$router->get('/form/{slug:[a-z0-9\-]+}', FormsPublicController::class . '@show');

// Страницы услуг.
if (is_file(__DIR__ . '/src/Controllers/ServicePagesController.php')) $router->get('/services/{slug:[a-z0-9\-]+}', \Celena\Plugin\Leads\Controllers\ServicePagesController::class . '@show');

// Админка: конструктор форм (авторизация проверяется в контроллере).
$router->get('/admin/forms',                          \Celena\Plugin\Leads\Admin\FormsAdminController::class . '@index');
$router->get('/admin/forms/create',                   \Celena\Plugin\Leads\Admin\FormsAdminController::class . '@create');
$router->post('/admin/forms/create',                  \Celena\Plugin\Leads\Admin\FormsAdminController::class . '@store');
$router->get('/admin/forms/{id:\d+}/edit',            \Celena\Plugin\Leads\Admin\FormsAdminController::class . '@edit');
$router->post('/admin/forms/{id:\d+}/update',         \Celena\Plugin\Leads\Admin\FormsAdminController::class . '@update');
$router->post('/admin/forms/{id:\d+}/delete',         \Celena\Plugin\Leads\Admin\FormsAdminController::class . '@delete');
$router->get('/admin/forms/{id:\d+}/submissions',     \Celena\Plugin\Leads\Admin\FormsAdminController::class . '@submissions');
$router->get('/admin/forms/{id:\d+}/export',          \Celena\Plugin\Leads\Admin\FormsAdminController::class . '@export');
$router->post('/admin/forms/sub/{id:\d+}/status',     \Celena\Plugin\Leads\Admin\FormsAdminController::class . '@subStatus');
$router->post('/admin/forms/sub/{id:\d+}/delete',     \Celena\Plugin\Leads\Admin\FormsAdminController::class . '@subDelete');

// Легаси: исторические заявки cl_leads («Все заявки»).
$router->get('/admin/leads',                       \Celena\Plugin\Leads\Admin\LeadsAdminController::class . '@index');
$router->post('/admin/leads/{id:\d+}/status',      \Celena\Plugin\Leads\Admin\LeadsAdminController::class . '@setStatus');
$router->post('/admin/leads/{id:\d+}/delete',      \Celena\Plugin\Leads\Admin\LeadsAdminController::class . '@delete');

// Инъекция дефолтной формы в лендинг ({leads_form_html|raw} в home.tpl).
\Celena\Core\Plugin\Hook::addFilter('template.globals', function (array $vars) use ($container): array {
    $html = '';
    try {
        $form = (new FormRepository($container->make(Connection::class)))->default();
        if ($form !== null) {
            $html = FormRenderer::render($form);
        }
    } catch (\Throwable) {
    }
    $vars['leads_form_html'] = $html;
    return $vars;
}, 0);

// Пункт сайдбара «Заявки» с подменю.
\Celena\Core\Plugin\Hook::addFilter('admin.sidebar', function (array $items): array {
    $icon = new \Celena\Core\Template\Tags\IconTag();
    $items[] = [
        'svg'          => $icon(['name' => 'mail', 'size' => 22, 'class' => 'sb-ico']),
        'label'        => 'Заявки',
        'url'          => '/admin/forms',
        'slug'         => 'forms',
        'active_slugs' => ['forms', 'leads'],
        'children'     => [
            ['label' => 'Формы',      'url' => '/admin/forms', 'slug' => 'forms'],
            ['label' => 'Все заявки', 'url' => '/admin/leads', 'slug' => 'leads'],
        ],
    ];
    return $items;
});

// Колокольчик: новые заявки (конструктор + легаси).
\Celena\Core\Plugin\Hook::addFilter('admin.notifications', function (array $items) use ($container): array {
    try {
        $conn = $container->make(Connection::class);
        $n = (new FormRepository($conn))->newCountAll();
        try { $n += $conn->builder('leads')->where('status', '=', 'new')->count(); } catch (\Throwable) {}
        if ($n > 0) {
            $items[] = [
                'title' => 'Новые заявки с сайта',
                'text'  => $n . ' шт. ждут ответа',
                'url'   => '/admin/forms',
                'time'  => '',
            ];
        }
    } catch (\Throwable) {
    }
    return $items;
});
