//
// Created by taynpg on 24-8-6.
//

#include "FunctionImp.h"
#include <wx/tokenzr.h>

CFunPack::CFunPack() = default;

bool CFunPack::gen(const wxString& bin, const wxString& out_dir, const wxArrayString& dirs)
{
    auto ret_source = get_depend_on(bin, dirs);
    auto result = parse_result(ret_source);
    return true;
}

wxArrayString CFunPack::get_depend_on(const wxString& bin, const wxArrayString& dirs)
{
    wxArrayString array;
    wxString cmd;
    if (!dirs.empty()) {
        cmd.append("export LD_LIBRARY_PATH=$LD_LIBRARY_PATH");
        for (const auto& data : dirs) {
            cmd.append(":" + data);
        }
    }
    cmd.append(" && ldd " + bin);

    FILE* pf = nullptr;
    if ((pf = popen(cmd.c_str(), "r")) == nullptr) {
        return array;
    }

    char  buffer[1024]{};
    wxString result{};
    while (std::fgets(buffer, sizeof(buffer), pf)) {
        result.append(buffer);
    }

    array = wxStringTokenize(result, "\t");
    return array;
}

std::list<wxString> CFunPack::parse_result(const wxArrayString& array)
{
    std::list<wxString> ret;
    wxArrayString simlog;
    wxArrayString bk_arry = array;

    for (auto& data : bk_arry) {

        if (data.empty()) {
            continue;
        }

        if (data.Contains("not found")) {
            simlog.push_back(wxT("未找到依赖:" + data));
            continue;
        }

        data.Replace("=>", "");
        wxArrayString tokens = wxStringTokenize(data, " ");
        wxString dy;
        if (tokens.size() == 4) {
            dy = tokens[2];
        }
        if (tokens.size() == 3) {
            dy = tokens[1];
        }
        if (dy.starts_with("/lib")) {
            continue;
        }
        if (!dy.empty()) {
            ret.push_back(dy);
        }
    }
    return ret;
}


CFunInstall::CFunInstall()
= default;

bool CFunInstall::install(const wxString& file, const wxString& ico)
{
    return true;
}