#!/usr/bin/env python3

import json
from app.common import bash_wrapper
import shutil


def traverse_json_base(json_dict: dict, path: list[str]):
    final_paths = []
    for key, value in json_dict.items():
        if isinstance(value, dict):
            keys = value.keys()
            if "type" in keys and value["type"] in [
                "nixos-configuration",
                "derivation",
            ]:
                final_paths += [".".join(path + [key])]
            else:
                final_paths += traverse_json_base(value, path + [key])
    return final_paths


def traverse_json(json_dict: dict):
    return traverse_json_base(json_dict, [])


def get_derivations(path_to_flake: str):
    nix_path = shutil.which("nix")
    flake_show = bash_wrapper(f"{nix_path} flake show --json", path=path_to_flake)
    if flake_show[1] != 0:
        raise RuntimeError("flake show returned non-zero exit code")
    flake_show_json = json.loads(flake_show[0])
    derivations = traverse_json(flake_show_json)
    return derivations