#!/usr/bin/env python3

import sys
import os
import subprocess
import serial.tools.list_ports as list_ports
import argparse
from threading import Timer
from common import *


def monitorEsp32Image(img, extra):
    monitor = os.path.dirname(os.path.realpath(__file__))
    monitor = os.path.join(monitor, "_idf_monitor.py")

    env = os.environ.copy()
    env["ROFI_MONITORED_TARGET"] = img.name
    # ESP-IDF uses /dev/ttyUSB by default which is not suitable for RoFI.
    availablePorts = list_ports.comports()
    if len(availablePorts):
        env["ESPTOOL_PORT"] = availablePorts[0].device

    command = ["python", monitor]
    command += extra
    command += [os.path.splitext(img.path)[0] + ".elf"]
    print(command)
    retcode = subprocess.call(command, env=env)
    return retcode

def monitor(args):
    parser = argparse.ArgumentParser("monitor")
    parser.add_argument("-p", "--port", help="Set port", default=None)
    parser.add_argument("-B", "--monitor-baud", type=int,
                        help="Set baudrate", default=115200)

    pargs = parser.parse_args(args)

    if pargs.port is None:
        availablePorts = list_ports.comports()
        pargs.port = availablePorts[0].device

    command = [sys.executable, "-m", "serial.tools.miniterm", pargs.port, str(pargs.monitor_baud)]
    print(command)
    retcode = subprocess.call(command)
    return retcode


def monitorStm32(args):
    def reset():
        subprocess.call(["st-info", "--probe"])
    t = Timer(1, reset)
    t.start()
    monitor(args)


def run():
    if len(sys.argv) < 2 or (len(sys.argv) >= 3 and sys.argv[2] != "--"):
        sys.exit(
            "Invalid usage!\n\n"
            "Invoke as rmonitor <name_of_image> -- <extra monitor parameters>...\n"
        )
    extraArgs = sys.argv[3:]
    imgs = collectImages()
    try:
        img = imgs[sys.argv[1]]
    except KeyError:
        sys.exit(f"Unknown image {sys.argv[1]}")
    if img.suite == "esp32":
        retcode = monitorEsp32Image(img, extraArgs)
        sys.exit(retcode)
    if img.suite == "stm32":
        retcode = monitorStm32(extraArgs)
        sys.exit(retcode)
    else:
        sys.exit(f"Unsupported platform {img.suite}")


if __name__ == "__main__":
    run()
