#include <napi.h>
#include <unistd.h>
#include <vector>

Napi::Value RunExecv(const Napi::CallbackInfo& info) {
    Napi::Env env = info.Env();

    // 定义命令和参数
    std::vector<const char*> args = {"/bin/ls", "-l", nullptr};

    // Fork 子进程
    pid_t pid = fork();

    if (pid < 0) {
        Napi::Error::New(env, "Failed to fork").ThrowAsJavaScriptException();
        return env.Null();
    }

    if (pid == 0) {
        // 子进程，执行 execv
        int status = execv("/bin/ls", const_cast<char* const*>(args.data()));
        _exit(1); // 如果 execv 失败，则退出子进程
    }

    // 父进程，等待子进程完成
    int status;
    waitpid(pid, &status, 0);

    return Napi::Number::New(env, status);
}
// // 这是将被暴露给 JavaScript 的函数
// void Method(const FunctionCallbackInfo<Value> &args)
// {
//     Isolate *isolate = args.GetIsolate();
//     args.GetReturnValue().Set(String::NewFromUtf8(
//                                   isolate, "Hello World")
//                                   .ToLocalChecked());
// }

// // 关闭文件描述符
// void CloseFd(const FunctionCallbackInfo<Value> &args)
// {
//     Isolate *isolate = args.GetIsolate();
//     Local<v8::Context> context = isolate->GetCurrentContext(); // 获取当前上下文
//     int fd = args[0]->NumberValue(context).ToChecked();
//     close(fd);
// }


// pid = fork(); // 使用 fork 创建子进程
    // std::cout << "[INFO] 主进程打印pid fork: " << pid << std::endl;
    // if (pid == -1)
    // {
    //     std::cout << "[INFO] fork failed" << std::endl;
    //     return Napi::Number::New(napiEnv, -1);
    // }
    // else if (pid == 0)
    // {
    //     // sleep(1);
    //     // 子进程
    //     // 关闭不需要的文件描述符
    //     close(master);
    //     dup2(slave, STDIN_FILENO);
    //     dup2(slave, STDOUT_FILENO);
    //     dup2(slave, STDERR_FILENO);

    //     // 关闭 slave，因为已经重定向
    //     // close(slave);
    //     std::cout << "[INFO] execvp: 子进程要执行啦," << getpid() << std::endl;
    //     execvp(cmd.c_str(), argv); // 使用 execvp 执行命令

    //     perror("exec failed"); // execvp 失败时输出错误
    //     exit(EXIT_FAILURE);
    // }


    // void execvTest(const Napi::CallbackInfo &info)
// {
//     std::cout << "[INFO] execvTest start" << std::endl;
//     const char *command = "/bin/ls";               // ls 命令的路径
//     const char *args[] = {command, "-l", nullptr}; // 参数数组，以 nullptr 结尾

//     // 调用 execv 执行命令
//     if (execv(command, const_cast<char *const *>(args)) == -1)
//     {
//         // 如果 execv 返回 -1，则表示执行失败
//         std::cerr << "Error executing ls -l: " << strerror(errno) << std::endl;
//     }
//     std::cout << "[INFO] execvTest failed" << std::endl;
// }
Napi::Object Init(Napi::Env env, Napi::Object exports) {
    exports.Set(Napi::String::New(env, "runExecv"), Napi::Function::New(env, RunExecv));
    return exports;
}

NODE_API_MODULE(execv, Init)
