#!/usr/bin/env python3
"""
quick_sim.py is a tool to quickly launch simulations

It does a fuzzy search using fzf on the scripts directory
and then executes them using renode.
"""
import argparse
import logging
import os
import subprocess
from glob import iglob

from pyfzf.pyfzf import FzfPrompt

parser = argparse.ArgumentParser(
    description="Start renode simulation.")

parser.add_argument('--script', dest='script_file',
                    help='script file to run within renode',
                    default="")

parser.add_argument('--prompt-elf', dest='prompt_elf',
                    help='prompt for elf',
                    default=False, action="store_true")

parser.add_argument('--elf', dest='elf_file',
                    help='elf to run within renode',
                    default="")

parser.add_argument('--start-sim', dest='start_sim',
                    help='start the simulator',
                    default=False, action="store_true")

parser.add_argument("-v", "--verbose", help="increase output verbosity",
                    action="store_true")

args = parser.parse_args()
env = os.environ.copy()

if args.verbose:
    logging.basicConfig(level=logging.DEBUG)


def prompt_for_file(search_paths):
    """ Prompt user for a file using a list of search paths."""

    paths = []

    for scripts  in [iglob(p, recursive=True) for p in search_paths]:
        paths += scripts

    fzf = FzfPrompt()
    script_file = fzf.prompt(paths)[0]
    return script_file


def launch_renode(script_file, elf_file, start=False):
    """ Given a script execute it in our environment using renode"""

    cmd = ["mono",
            "%s/host/renode/Renode.exe" % env['OUT']]

    if not elf_file == "":
        cmd.append(r'-e"\$bin=@%s"' % elf_file)

    cmd.append('-e"i @%s"' % script_file)
    if start:
        cmd.append('-e"start"')

    cmd.append("--disable-xwt")
    cmd = " ".join(cmd)
    logging.info("Executing command: %s", cmd)

    try:
        proc = subprocess.Popen(cmd, env=env, shell=True)
        while True:
            pass
    except KeyboardInterrupt:
        proc.wait()
        logging.info("Exiting simulation")

def main():
    """ Main entry point for quick_sim.py"""

    logging.debug("Change directory to ROOTDIR")
    if "ROOTDIR" in env:
        os.chdir(env['ROOTDIR'])
        logging.debug("Current directory set to %s", os.path.abspath(os.curdir))
    else:
        parser.error("Please source setup script: source build/setup.sh")

    logging.info("Looking for simulation scripts to run...")

    search_path_names = ["sim/config/**/*.resc", "out/renode_configs/*.resc"]

    script_file = args.script_file
    if script_file == "":
        script_file = prompt_for_file(search_path_names)

    logging.debug("Selected %s", script_file)
    if not os.path.exists(script_file):
        parser.error("Selected script does not exist.")

    elf_file = args.elf_file
    if args.prompt_elf:
        search_path_names = ["out/**/*.elf"]
        if elf_file == "":
            elf_file = prompt_for_file(search_path_names)

        logging.debug("Selected elf %s", elf_file)
        if not os.path.exists(elf_file):
            parser.error("Selected elf does not exits.")

    launch_renode(script_file, elf_file, args.start_sim)

if __name__ == "__main__":
    main()
