"""
Used to take care of the options that end in `_dir`. The assumption is that
`_dir` options need to be treated differently. They need to verified to exist
and they need to be rooted based on the user, root option etc.
"""
import os

import pop.hub


def roots(hub: "pop.hub.Hub", default_root, f_opts, root_dir):
    """
    Detect the root dir data and apply it
    """
    os_root = os.path.abspath(os.sep)
    root = os_root
    change = False
    non_priv = False
    if hasattr(os, "geteuid"):
        if not os.geteuid() == 0:
            change = True
            non_priv = True
    if root_dir and root_dir != default_root:
        root = root_dir
        change = True
    if not root.endswith(os.sep):
        root = f"{root}{os.sep}"
    if change:
        for imp in f_opts:
            for key in f_opts[imp]:
                if key == "root_dir":
                    continue
                if key.endswith("_dir"):
                    if non_priv:
                        root = os.path.join(os.environ["HOME"], f".{imp}{os.sep}")
                    if imp in f_opts[imp][key]:
                        a_len = len(imp) + 1
                        f_opts[imp][
                            key
                        ] = f"{os_root}{f_opts[imp][key][f_opts[imp][key].index(imp)+a_len:]}"
                    f_opts[imp][key] = f_opts[imp][key].replace(os_root, root, 1)


def verify(hub: "pop.hub.Hub", opts):
    """
    Verify that the environment and all named directories in the
    configuration exist
    """
    for key in opts:
        if key == "root_dir":
            continue
        if key == "config_dir":
            continue
        if key.endswith("_dir"):
            if not os.path.isdir(opts[key]):
                os.makedirs(opts[key])
