// relaunch.cpp - Implementacio del reinici en calent
// © 2026 JailDesigner

#include "core/system/relaunch.hpp"

#include <cerrno>
#include <cstdlib>
#include <cstring>
#include <iostream>

#ifdef _WIN32
#include <process.h>  // _execv
#else
#include <unistd.h>  // execv
#endif

namespace {

    // Estat global (process-scope). Aquesta TU es la unica que gestiona el
    // reinici, aixi que els static interns no s'escapen.
    char** g_argv = nullptr;
    bool g_requested = false;

}  // namespace

namespace System::Relaunch {

    void setArgv(int /*argc*/, char** argv) {
        g_argv = argv;
    }

    void request() {
        g_requested = true;
    }

    auto isRequested() -> bool {
        return g_requested;
    }

    void execIfRequested() {
#ifdef __EMSCRIPTEN__
        // Al navegador el reinici real seria location.reload(); aqui no fem res.
        return;
#else
        if (!g_requested || g_argv == nullptr || g_argv[0] == nullptr) {
            return;
        }
        std::cout << "[Relaunch] Reiniciant " << g_argv[0] << "...\n";
#ifdef _WIN32
        _execv(g_argv[0], g_argv);
#else
        execv(g_argv[0], g_argv);
#endif
        // Si arribem aqui, execv ha fallat. Tots els subsistemes ja estan
        // destruits; sortim amb error i el shell rebra el codi.
        std::cerr << "[Relaunch] Ha fallat: " << std::strerror(errno) << '\n';
        std::exit(EXIT_FAILURE);
#endif
    }

}  // namespace System::Relaunch
