#!/usr/bin/python

import argparse
import fuse
import os
import sys

from mpy_utils.replcontrol import ReplControl, ReplIOFileHandle, ReplIOSerial
from mpy_utils.replfuseops import ReplFuseOps

parser = argparse.ArgumentParser(description="FUSE mount a device using only the REPL")
parser.add_argument("--port", default="/dev/ttyUSB0", help="serial port device")
parser.add_argument("--baud", default=115200, type=int, help="port speed in baud")
parser.add_argument(
    "--pipe", action="store_true", help="use stdin/stdout instead of serial port"
)
parser.add_argument("--base", default="/", help="base path on device")
parser.add_argument(
    "--delay", default=100.0, type=float, help="delay between lines (ms)"
)
parser.add_argument(
    "--debug", default=False, action="store_true", help="print debugging info"
)
parser.add_argument(
    "--reset", default=True, action="store_false", help="resets after unmounting"
)
parser.add_argument("mount_point")
args = parser.parse_args()

try:
    os.makedirs(args.mount_point, exist_ok=True)
except FileExistsError:
    print("mount_point is not a directory")
    exit(1)

if args.pipe:
    repl_io = ReplIOFileHandle(infh=sys.stdin, outfh=sys.stdout)
    fsname = "mpy-fuse:pid/%s" % os.getpid()
else:
    repl_io = ReplIOSerial(port=args.port, baud=args.baud, delay=args.delay)
    fsname = "mpy-fuse:%s" % args.port

repl_control = ReplControl(
    io=repl_io, delay=args.delay, debug=args.debug, reset=args.reset,
)

fuse.FUSE(
    operations=ReplFuseOps(repl_control, base_path=args.base),
    fsname=fsname,
    mountpoint=args.mount_point,
    nothreads=True,
    foreground=True,
)
