import subprocess as sps
import webbrowser as wbr

from . import chrome as chm
from . import electron as ele
from . import edge as edge

# import eel.firefox as ffx      TODO
# import eel.safari as saf       TODO

_browser_paths = {}
_browser_modules = {"chrome": chm, "electron": ele, "edge": edge}


def _build_url_from_dict(page, options):
    scheme = page.get("scheme", "http")
    host = page.get("host", "localhost")
    port = page.get("port", options["port"])
    path = page.get("path", "")
    return "%s://%s:%d/%s" % (scheme, host, port, path)


def _build_url_from_string(page, options):
    base_url = "http://%s:%d/" % (options["host"], options["port"])
    return base_url + page


def _build_urls(start_pages, options):
    urls = []

    for page in start_pages:
        method = (
            _build_url_from_dict if isinstance(page, dict) else _build_url_from_string
        )
        url = method(page, options)
        urls.append(url)

    return urls


def open(start_pages, options):
    # Build full URLs for starting pages (including host and port)
    start_urls = _build_urls(start_pages, options)

    mode = options.get("mode")
    if mode in [None, False]:
        # Don't open a browser
        pass
    elif mode == "custom":
        # Just run whatever command the user provided
        sps.Popen(
            options["cmdline_args"], stdout=sps.PIPE, stderr=sps.PIPE, stdin=sps.PIPE
        )
    elif mode in _browser_modules:
        # Run with a specific browser
        browser_module = _browser_modules[mode]
        path = _browser_paths.get(mode)
        if path is None:
            # Don't know this browser's path, try and find it ourselves
            path = browser_module.find_path()
            _browser_paths[mode] = path

        if path is not None:
            browser_module.run(path, options, start_urls)
        else:
            raise EnvironmentError("Can't find %s installation" % browser_module.name)
    else:
        # Fall back to system default browser
        for url in start_urls:
            wbr.open(url)


def set_path(browser_name, path):
    _browser_paths[browser_name] = path


def get_path(browser_name):
    return _browser_paths.get(browser_name)
