#!/usr/bin/python3

import os
import subprocess
import sys
from contextlib import contextmanager
from pathlib import Path
from tempfile import TemporaryDirectory

import anyio
import asyncclick as click
from anyio.streams.text import TextReceiveStream

from microfuse.link import Link
from microfuse.multiplex import Multiplexer
from microfuse.util import attrdict

click.anyio_backend="trio"


@click.group()
@click.option("-v","--verbose","verbose", is_flag=True,help="tell what's happening")
@click.argument("socket", type=click.Path())
@click.pass_context
async def main(ctx, socket, verbose):
    try:
        os.stat(socket)
    except FileNotFoundError:
        p = os.path.join(os.environ["XDG_RUNTIME_DIR"], socket)
        if p != socket:
            socket = p
            os.stat(socket)
        else:
            raise
    ctx.obj = attrdict()
    ctx.obj.link = await ctx.with_async_resource(Link(socket))


@main.command()
@click.option("-t","--timeout", type=int, help="Timeout to use")
@click.argument("message", type=str, nargs=-1)
@click.pass_obj
async def ping(obj, timeout, message):
    if message:
        message = " ".join(message)
    else:
        message = None
    await obj.link.ping(timeout=timeout, msg=message)


@main.command()
@click.option("-b", "--blocksize", type=int, help="Max read/write message size", default=256)
@click.argument("path", type=click.Path(file_okay=False, dir_okay=True), nargs=1)
@click.pass_obj
async def mount(obj, path, blocksize):
    async with obj.link.mount(path, blocksize=blocksize):
        while True:
            await anyio.sleep(99999)


if __name__ == "__main__":
    main()
