# -*- coding: utf-8 -*-
# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this file,
# You can obtain one at http://mozilla.org/MPL/2.0/.

import requests

__versions = None


def __get_major(v):
    return int(v.split(".")[0])


def __getVersions():
    """Get the versions number for each channel

    Returns:
        dict: versions for each channel
    """
    r = requests.get("https://product-details.mozilla.org/1.0/firefox_versions.json")
    data = r.json()

    nightly = data["FIREFOX_NIGHTLY"]
    esr = data["FIREFOX_ESR_NEXT"]
    if not esr:
        esr = data["FIREFOX_ESR"]
    if esr.endswith("esr"):
        esr = esr[:-3]

    return {
        "release": data["LATEST_FIREFOX_VERSION"],
        "beta": data["LATEST_FIREFOX_RELEASED_DEVEL_VERSION"],
        "nightly": nightly,
        "esr": esr,
    }


def get(base=False):
    """Get current version number by channel

    Returns:
        dict: containing version by channel
    """
    global __versions
    if not __versions:
        __versions = __getVersions()

    if base:
        res = {}
        for k, v in __versions.items():
            res[k] = __get_major(v)
        return res

    return __versions


def getStabilityReleases(base):
    r = requests.get(
        "https://product-details.mozilla.org/1.0/firefox_history_stability_releases.json"
    )
    data = r.json()

    return [v for v in data.keys() if v.startswith(base + ".")]


def getDevelopmentReleases(base):
    r = requests.get(
        "https://product-details.mozilla.org/1.0/firefox_history_development_releases.json"
    )
    data = r.json()

    return [v for v in data.keys() if v.startswith(base + ".")]


def get_channel_versions(channel, product="Firefox"):
    channel = channel.lower()
    version = str(get(base=True)[channel])

    if channel == "nightly":
        return ["{}.0a1".format(version)]
    elif channel == "release":
        return ["{}.0".format(version)] + getStabilityReleases(version)
    elif channel == "beta":
        return getDevelopmentReleases(version)
    else:
        assert False, "Unknown channel {}".format(channel)
