"""
Utilities for managing Debian preseed

.. versionadded:: 2015.8.0
"""

import shlex

import salt.utils.files
import salt.utils.stringutils
import salt.utils.yaml


def mksls(src, dst=None):
    """
    Convert a preseed file to an SLS file
    """
    ps_opts = {}
    with salt.utils.files.fopen(src, "r") as fh_:
        for line in fh_:
            line = salt.utils.stringutils.to_unicode(line)
            if line.startswith("#"):
                continue
            if not line.strip():
                continue

            comps = shlex.split(line)
            if comps[0] not in ps_opts.keys():
                ps_opts[comps[0]] = {}
            cmds = comps[1].split("/")

            pointer = ps_opts[comps[0]]
            for cmd in cmds:
                pointer = pointer.setdefault(cmd, {})

            pointer["type"] = comps[2]
            if len(comps) > 3:
                pointer["argument"] = comps[3]

    sls = {}

    # Set language
    # ( This looks like it maps to something else )
    sls[ps_opts["d-i"]["languagechooser"]["language-name-fb"]["argument"]] = {
        "locale": ["system"]
    }

    # Set keyboard
    # ( This looks like it maps to something else )
    sls[ps_opts["d-i"]["kbd-chooser"]["method"]["argument"]] = {"keyboard": ["system"]}

    # Set timezone
    timezone = ps_opts["d-i"]["time"]["zone"]["argument"]
    sls[timezone] = {"timezone": ["system"]}
    if ps_opts["d-i"]["tzconfig"]["gmt"]["argument"] == "true":
        sls[timezone]["timezone"].append("utc")

    # Set network
    if "netcfg" in ps_opts["d-i"].keys():
        iface = ps_opts["d-i"]["netcfg"]["choose_interface"]["argument"]
        sls[iface] = {}
        sls[iface]["enabled"] = True
        if ps_opts["d-i"]["netcfg"]["confirm_static"] == "true":
            sls[iface]["proto"] = "static"
        elif ps_opts["d-i"]["netcfg"]["disable_dhcp"] == "false":
            sls[iface]["proto"] = "dhcp"
        sls[iface]["netmask"] = ps_opts["d-i"]["netcfg"]["get_netmask"]["argument"]
        sls[iface]["domain"] = ps_opts["d-i"]["netcfg"]["get_domain"]["argument"]
        sls[iface]["gateway"] = ps_opts["d-i"]["netcfg"]["get_gateway"]["argument"]
        sls[iface]["hostname"] = ps_opts["d-i"]["netcfg"]["get_hostname"]["argument"]
        sls[iface]["ipaddress"] = ps_opts["d-i"]["netcfg"]["get_ipaddress"]["argument"]
        sls[iface]["nameservers"] = ps_opts["d-i"]["netcfg"]["get_nameservers"][
            "argument"
        ]

    if dst is not None:
        with salt.utils.files.fopen(dst, "w") as fh_:
            salt.utils.yaml.safe_dump(sls, fh_, default_flow_style=False)
    else:
        return salt.utils.yaml.safe_dump(sls, default_flow_style=False)
