#!/usr/bin/env python3
#
# Copyright (C) 2022 Leandro Lisboa Penz <lpenz@lpenz.org>
# This file is subject to the terms and conditions defined in
# file 'LICENSE', which is part of this source code package.
"""
Interactively explore a json file
"""

import argparse
import json
from collections.abc import Container

import tuzue


def generator(itemdict, data):
    yield ".."
    if isinstance(data, list):
        for key in range(0, len(data)):
            item = "[%s] = %s" % (key, repr(data[key]))
            path = "[%s]" % key
            itemdict[item] = (path, data[key])
            yield item
    elif isinstance(data, dict):
        for key, value in data.items():
            item = "[%s] = %s" % (repr(key), repr(value))
            path = "[%s]" % repr(key)
            itemdict[item] = (path, value)
            yield item


def jsonexplore(path0, data):
    itemdict = {}
    view = tuzue.view.View(title="".join(path0), generator=generator(itemdict, data))
    while True:
        with tuzue.ui.curses.context() as ui:
            done = False
            while not done:
                ui.show(view)
                done = ui.interact(view)
        item = view.selected_item()
        if item == "..":
            return
        itemdata = itemdict[item]
        if not isinstance(itemdata[1], Container) or isinstance(itemdata[1], str):
            continue
        path = list(path0)
        path.append(itemdata[0])
        jsonexplore(path, itemdata[1])


def main():
    parser = argparse.ArgumentParser(description=__doc__)
    parser.add_argument("json", nargs=1, type=argparse.FileType("r"))
    parser.add_argument(
        "--version", "-V", action="version", version="%(prog)s " + tuzue.__version__
    )
    args = parser.parse_args()
    data = json.load(args.json[0])
    jsonexplore(["_"], data)


if __name__ == "__main__":
    main()
