import os
import sys
from pathlib import Path
import tkinter
import tkinter.ttk

v = os.environ.get("tklibPath", None)
if v:
    pythonlib_path = v
else:
    script_path = sys.argv[0]
    tkProg_Root = os.path.join(script_path, "../../..")
    pythonlib_path = os.path.abspath(os.path.join(tkProg_Root, "tklib/python"))
sys.path.append(pythonlib_path)

from tklib.tkutils import split_file_path
from tklib.tkscript_macro import tkScript
from tkLScriptApp import tkLScriptApp


USAGE = """\
usage:
  python lscript.py target.ini "[Button1.Diode]"
  python lscript.py target.ini "[Button1.Diode]" --boot path/to/3-000-Boot.ini
  python lscript.py target.ini "[Button1.Diode]" --extra another.ini
"""


def decompose_requested_section(section: str):
    engine = tkScript([])
    menu, idx, action = engine.decompose_section(section)
    if idx in ("", None):
        idxm1 = None
    else:
        idxm1 = int(idx) - 1
    return menu, idxm1, action


def make_script_dict(paths):
    out = {}
    for i, p in enumerate(paths):
        p = os.path.abspath(p)
        out[f"{i:04d}:{os.path.basename(p)}"] = {"path": p}
    return out


def find_default_boot(target_ini: str):
    target = Path(target_ini).resolve()
    candidates = [
        target.parent / "3-000-Boot.ini",
        target.parent / "Boot.ini",
        target.parent.parent / "scripts" / "3-000-Boot.ini",
        Path(__file__).resolve().parent / "scripts" / "3-000-Boot.ini",
    ]
    for c in candidates:
        if c.exists():
            return str(c)
    return None


def parse_args(argv):
    if len(argv) < 3:
        print(USAGE)
        sys.exit(2)

    target_ini = argv[1]
    section = argv[2]
    boot_ini = None
    extra = []

    i = 3
    while i < len(argv):
        a = argv[i]
        if a == "--boot" and i + 1 < len(argv):
            boot_ini = argv[i + 1]
            i += 2
        elif a == "--extra" and i + 1 < len(argv):
            extra.append(argv[i + 1])
            i += 2
        else:
            raise SystemExit(f"Unknown argument: {a}\n\n{USAGE}")

    return target_ini, section, boot_ini, extra


def main():
    target_ini, section, boot_ini, extra = parse_args(sys.argv)

    if not os.path.exists(target_ini):
        raise SystemExit(f"Target ini file does not exist: {target_ini}")

    if boot_ini is None:
        boot_ini = find_default_boot(target_ini)

    app = tkLScriptApp(usage_str=USAGE, globals=globals(), locals=locals())
    app.load_config_like_launcher()

    script_paths = []
    if boot_ini and os.path.exists(boot_ini):
        script_paths.append(os.path.abspath(boot_ini))
    script_paths.extend(os.path.abspath(p) for p in extra if os.path.exists(p))
    script_paths.append(os.path.abspath(target_ini))

    app.script_files = make_script_dict(script_paths)
    app.s_engine = app.create_script()

    cparams = app.get_params()
    _, _, filebody, _ = split_file_path(os.path.abspath(target_ini))
    cparams.script_list_name = filebody
    cparams.script_list_path = os.path.abspath(target_ini)

    app.update_script_vars(cparams)
    app.s_engine.update_script_vars(app, cparams)

    app.run_boot_sections()

    app.update_script_vars(cparams)
    app.s_engine.update_script_vars(app, cparams)

    menu, idxm1, action = decompose_requested_section(section)
    ret = app.s_engine.execute(
        app,
        cparams,
        menu,
        idx=idxm1,
        action=action,
        i_mouse_button="1",
        script_files=app.s_engine.script_files,
    )
    return 0 if ret is None else ret


if __name__ == "__main__":
    raise SystemExit(main())
