#include <pybind11/pybind11.h>
#include <pybind11/stl.h>  // 支持 std::vector, std::map 等
#include <nlohmann/json.hpp>
#include <cstring>
#include <cstdint>
#include <vector>
#include <string>
#include <fstream>
#include <array>

#include "msg_handler.hpp"
#include "native_logger.hpp"
#include "decrypt_ota_file.hpp"
#include "utils.hpp"
#include "tcp_ssl_password.hpp"

namespace py = pybind11;
using json = nlohmann::json;

namespace {
    // 配置项
    const std::string _cfg_server_ip = "www.shelingxingqiu.com";
    const int _cfg_server_port = 50005;
    const std::string _cfg_device_id_file = "/device_key";


}

// 定义获取配置的函数
py::dict get_config() {
    py::dict config;
    config["SERVER_IP"] = _cfg_server_ip;
    config["SERVER_PORT"] = _cfg_server_port;
    return config;
}





PYBIND11_MODULE(archery_netcore, m) {
    m.doc() = "Archery net core (native, pybind11).";

    // Optional: configure native logger from Python.
    // Default log file: /maixapp/apps/t11/netcore.log
    m.def("set_log_file", [](const std::string& path) { netcore::set_log_file(path); }, py::arg("path"));
    m.def("set_log_level", [](int level) {
        if (level < 0) level = 0;
        if (level > 3) level = 3;
        netcore::set_log_level(static_cast<netcore::LogLevel>(level));
    }, py::arg("level"));
    m.def("log_test", [](const std::string& msg) {
        netcore::log_info(std::string("log_test: ") + msg);
    }, py::arg("msg"));

    m.def("make_packet", &netcore::make_packet,
          "Pack TCP packet: header (len+type+checksum) + JSON body",
          py::arg("msg_type"), py::arg("body_dict"));
    
    m.def("parse_packet", &netcore::parse_packet,
          "Parse TCP packet, return (msg_type, body_dict)");

    m.def("get_config", &get_config, "Get system configuration");

    m.def(
        "calculate_tcp_ssl_password",
        &netcore::calculate_tcp_ssl_password,
        "Calculate TCP SSL password: hex(md5(hex(md5(device_id)) + iccid))",
        py::arg("device_id"),
        py::arg("iccid")
    );

    m.def(
        "decrypt_ota_file",
        [](const std::string& input_path, const std::string& output_zip_path) {
            netcore::log_info(std::string("decrypt_ota_file in=") + input_path + " out=" + output_zip_path);
            return netcore::decrypt_ota_file_impl(input_path, output_zip_path);
        },
        py::arg("input_path"),
        py::arg("output_zip_path"),
        "Decrypt OTA encrypted file (MAGIC|nonce|ciphertext|tag) to plaintext zip."
    );

    // Minimal demo: return actions for inner_cmd=41 (manual trigger + ack)
    m.def("actions_for_inner_cmd", [](int inner_cmd) {
        py::list actions;

        if (inner_cmd == 41) {
            // 1) set manual trigger flag
            {
                py::dict a;
                a["type"] = "SET_FLAG";
                py::dict args;
                args["name"] = "manual_trigger_flag";
                args["value"] = true;
                a["args"] = args;
                actions.append(a);
            }

            // 2) enqueue trigger_ack
            {
                py::dict a;
                a["type"] = "ENQUEUE";
                py::dict args;
                args["msg_type"] = 2;
                args["high"] = false;
                py::dict body;
                body["result"] = "trigger_ack";
                args["body"] = body;
                a["args"] = args;
                actions.append(a);
            }
        }

        return actions;
    });
}