<?php
// =============================================================
// LOGGER — общее логирование (bot.log + ротация)
// =============================================================
// Вынесено из bot.php, чтобы любой модуль (включая dashboard,
// который не подключает bot.php) мог писать в лог, не завися от
// порядка загрузки файлов. bot_log() вызывается из storage,
// collector, трекеров и т.д. — поэтому живёт в отдельном модуле,
// а не в точке входа.
// =============================================================

require_once __DIR__ . '/config.php';

/**
 * Ротирует лог-файл если он превысил LOG_MAX_BYTES.
 * Хранит LOG_ROTATE_KEEP старых файлов: bot.log.1, bot.log.2, ...
 */
function rotate_log_if_needed(): void
{
    if (!file_exists(LOG_FILE) || filesize(LOG_FILE) < LOG_MAX_BYTES) {
        return;
    }

    $keep = LOG_ROTATE_KEEP;

    // Удаляем самый старый файл если достигли лимита
    $oldest = LOG_FILE . '.' . $keep;
    if (file_exists($oldest)) {
        unlink($oldest);
    }

    // Сдвигаем: .2 → .3, .1 → .2
    for ($i = $keep - 1; $i >= 1; $i--) {
        $from = LOG_FILE . '.' . $i;
        $to   = LOG_FILE . '.' . ($i + 1);
        if (file_exists($from)) {
            rename($from, $to);
        }
    }

    // Текущий → .1
    rename(LOG_FILE, LOG_FILE . '.1');
}

/**
 * Пишет строку в лог-файл с timestamp.
 * Автоматически ротирует файл при достижении LOG_MAX_BYTES.
 * Создаёт директорию логов при необходимости.
 *
 * Объявление под guard'ом function_exists: dashboard (index.php) заранее
 * объявляет no-op заглушку bot_log(), чтобы не писать в основной лог бота,
 * а затем подключает collector.php → logger.php. Без guard'а это второе
 * объявление роняло страницу фаталом "Cannot redeclare bot_log()". Точки
 * входа без заглушки (bot.php, cron) получают настоящую реализацию ниже.
 */
if (!function_exists('bot_log')) {
    function bot_log(string $message): void
    {
        $dir = dirname(LOG_FILE);
        if (!is_dir($dir)) {
            mkdir($dir, 0755, true);
        }

        rotate_log_if_needed();
        $line = '[' . date('Y-m-d H:i:s') . '] ' . $message . PHP_EOL;
        file_put_contents(LOG_FILE, $line, FILE_APPEND | LOCK_EX);
    }
}
