"""
Module for gathering and managing information about MooseFS
"""

import salt.utils.path


def __virtual__():
    """
    Only load if the mfs commands are installed
    """
    if salt.utils.path.which("mfsgetgoal"):
        return "moosefs"
    return (
        False,
        "The moosefs execution module cannot be loaded: the mfsgetgoal binary is not in"
        " the path.",
    )


def dirinfo(path, opts=None):
    """
    Return information on a directory located on the Moose

    CLI Example:

    .. code-block:: bash

        salt '*' moosefs.dirinfo /path/to/dir/ [-[n][h|H]]
    """
    cmd = "mfsdirinfo"
    ret = {}
    if opts:
        cmd += " -" + opts
    cmd += " " + path
    out = __salt__["cmd.run_all"](cmd, python_shell=False)

    output = out["stdout"].splitlines()
    for line in output:
        if not line:
            continue
        comps = line.split(":")
        ret[comps[0].strip()] = comps[1].strip()
    return ret


def fileinfo(path):
    """
    Return information on a file located on the Moose

    CLI Example:

    .. code-block:: bash

        salt '*' moosefs.fileinfo /path/to/dir/
    """
    cmd = "mfsfileinfo " + path
    ret = {}
    chunknum = ""
    out = __salt__["cmd.run_all"](cmd, python_shell=False)

    output = out["stdout"].splitlines()
    for line in output:
        if not line:
            continue
        if "/" in line:
            comps = line.split("/")

            chunknum = comps[0].strip().split(":")
            meta = comps[1].strip().split(" ")

            chunk = chunknum[0].replace("chunk ", "")
            loc = chunknum[1].strip()
            id_ = meta[0].replace("(id:", "")
            ver = meta[1].replace(")", "").replace("ver:", "")

            ret[chunknum[0]] = {
                "chunk": chunk,
                "loc": loc,
                "id": id_,
                "ver": ver,
            }
        if "copy" in line:
            copyinfo = line.strip().split(":")
            ret[chunknum[0]][copyinfo[0]] = {
                "copy": copyinfo[0].replace("copy ", ""),
                "ip": copyinfo[1].strip(),
                "port": copyinfo[2],
            }
    return ret


def mounts():
    """
    Return a list of current MooseFS mounts

    CLI Example:

    .. code-block:: bash

        salt '*' moosefs.mounts
    """
    cmd = "mount"
    ret = {}
    out = __salt__["cmd.run_all"](cmd)

    output = out["stdout"].splitlines()
    for line in output:
        if not line:
            continue
        if "fuse.mfs" in line:
            comps = line.split(" ")
            info1 = comps[0].split(":")
            info2 = info1[1].split("/")
            ret[comps[2]] = {
                "remote": {
                    "master": info1[0],
                    "port": info2[0],
                    "subfolder": "/" + info2[1],
                },
                "local": comps[2],
                "options": (comps[5].replace("(", "").replace(")", "").split(",")),
            }
    return ret


def getgoal(path, opts=None):
    """
    Return goal(s) for a file or directory

    CLI Example:

    .. code-block:: bash

        salt '*' moosefs.getgoal /path/to/file [-[n][h|H]]
        salt '*' moosefs.getgoal /path/to/dir/ [-[n][h|H][r]]
    """
    cmd = "mfsgetgoal"
    ret = {}
    if opts:
        cmd += " -" + opts
    else:
        opts = ""
    cmd += " " + path
    out = __salt__["cmd.run_all"](cmd, python_shell=False)

    output = out["stdout"].splitlines()
    if "r" not in opts:
        goal = output[0].split(": ")
        ret = {
            "goal": goal[1],
        }
    else:
        for line in output:
            if not line:
                continue
            if path in line:
                continue
            comps = line.split()
            keytext = comps[0] + " with goal"
            if keytext not in ret:
                ret[keytext] = {}
            ret[keytext][comps[3]] = comps[5]
    return ret
