#include <iostream>
#include <sstream>
#include "process.h"
#include <filesystem>
#include <fstream>
#include <chrono>
#include <cstdlib>

namespace fs = std::filesystem;

std::string get_package_list() {
    const char* home = std::getenv("HOME");
    fs::path cache_dir = fs::path(home) / ".cache" / "xt";
    fs::path cache_file = cache_dir / "packages.txt";

    const auto max_age = std::chrono::minutes(30);

    if (fs::exists(cache_file)) {
    auto last_write = fs::last_write_time(cache_file);
    auto now = decltype(last_write)::clock::now();
    auto age = now - last_write;
        if (age < max_age) {
            std::ifstream in(cache_file);
            std::string contents((std::istreambuf_iterator<char>(in)), std::istreambuf_iterator<char>());
            return contents;
        }
    }

    // cache missing or stale, re-query
    char* const query_argv[] = { const_cast<char*>("xbps-query"), const_cast<char*>("-Rs"), const_cast<char*>(""), nullptr };
    std::string package_list = run_piped(query_argv, "");

    fs::create_directories(cache_dir);
    std::ofstream out(cache_file);
    out << package_list;

    return package_list;
}
std::string extract_pkgname(const std::string& fzf_line) {
    std::istringstream iss(fzf_line);
    std::string marker, pkgver;
    iss >> marker >> pkgver;
    return pkgver;
}
int main() {
    std::string package_list = get_package_list(); 
    char* const fzf_argv[] = { const_cast<char*>("fzf"), nullptr };
    std::string result = run_piped(fzf_argv, package_list);

    // strip trailing newline fzf adds
    if (!result.empty() && result.back() == '\n') {
        result.pop_back();
    }
    std::string pkgname = extract_pkgname(result);
    char* const install_argv[] = {
        const_cast<char*>("doas"),
        const_cast<char*>("xbps-install"),
        const_cast<char*>("-Sy"),
        pkgname.data(),
        nullptr
    };
    std::string status = spawn(install_argv);
    if (status == "error") {
        std::cerr << "failed to launch doas/xbps-install\n";
        return 1;
    }
    if (status.rfind("sig:", 0) == 0) {
        std::cerr << "xbps-install was killed by signal " << status.substr(4) << "\n";
        return 1;
    }
    if (status != "0") {
        std::cerr << "xbps-install exited with code " << status << "\n";
        return 1;
    }
    return 0;
}
