// main.cpp
#include <unistd.h>

#include <atomic>
#include <chrono>
#include <csignal>
#include <thread>

#include "app_config.hpp"
#include "logger.hpp"
#include "mqtt_client_wrapper.hpp"
#include "record_manager.hpp"
#include "rtmp_manager.hpp"

std::atomic<bool> g_running(true);

static void signal_handler(int signum)
{
    g_running.store(false, std::memory_order_relaxed);
    const char msg[] = "[MAIN] Signal received, shutting down...\n";
    write(STDERR_FILENO, msg, sizeof(msg) - 1);
}

int main()
{
    // ---------- 信号处理 ----------
    struct sigaction sa{};
    sa.sa_handler = signal_handler;
    sigemptyset(&sa.sa_mask);
    sa.sa_flags = 0;
    sigaction(SIGINT, &sa, nullptr);
    sigaction(SIGTERM, &sa, nullptr);
    signal(SIGPIPE, SIG_IGN);

    // ---------- 初始化日志 ----------
    Logger::init(get_executable_dir_file_path("logs"), 7);
    LOG_INFO("[MAIN] ===== Vehicle Video Service Starting =====");

    // 创建全局 RecordManager 实例
    g_record_manager = std::make_shared<RecordManager>("/home/aiec/srs/conf/kun_record.conf");

    try
    {
        // 加载配置
        g_app_config = AppConfig::load_from_file(get_executable_dir_file_path("config.json"));
        LOG_INFO("[MAIN] Loaded config from config.json");
    }
    catch (const std::exception& e)
    {
        LOG_ERROR(std::string("[MAIN] Failed to load config: ") + e.what());
        return -1;
    }

    // ---------- 初始化 GStreamer ----------
    RTMPManager::init();

    // ---------- 自动推流（8 路录像守护） ----------
    LOG_INFO("[MAIN] Starting all record streams...");
    RTMPManager::start_all();

    // 启动 MQTT 线程
    std::thread mqtt_thread(
        []
        {
            try
            {
                LOG_INFO("[MAIN] MQTT thread started.");
                mqtt_client_thread_func();  // 在回调里执行推流控制
            }
            catch (const std::exception& e)
            {
                LOG_ERROR(std::string("[MAIN] MQTT thread crashed: ") + e.what());
            }
            LOG_INFO("[MAIN] MQTT thread exiting...");
        });

    // 主循环，仅等待退出信号
    while (g_running.load(std::memory_order_relaxed)) std::this_thread::sleep_for(std::chrono::milliseconds(200));

    // ---------- 退出清理 ----------
    LOG_INFO("[MAIN] Shutdown requested. Stopping RTMP streams...");
    RTMPManager::stop_all();

    if (mqtt_thread.joinable())
    {
        mqtt_thread.join();
        LOG_INFO("[MAIN] MQTT thread joined.");
    }

    LOG_INFO("[MAIN] ===== Vehicle Video Service Exited Cleanly =====");
    return 0;
}
