#! /usr/bin/python3

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

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", count=True, help="tell what's happening (dup for more)")
@click.argument("socket", type=click.Path())
@click.pass_context
async def main(ctx, socket, verbose):
    logging.basicConfig(level=logging.DEBUG if verbose>1 else logging.INFO if verbose else logging.WARNING)

    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()
