"""
Rendering weather data in the Prometheus format.

"""

from datetime import datetime

from fields import DESCRIPTION


def _render_current(data, for_day="current", already_seen=[]):
    "Converts data into prometheus style format"

    output = []

    for field_name, val in DESCRIPTION.items():

        help, name = val

        try:
            value = data[field_name]
            if field_name == "weatherDesc":
                value = value[0]["value"]
        except (IndexError, KeyError):
            try:
                value = data["astronomy"][0][field_name]
                if value.endswith(" AM") or value.endswith(" PM"):
                    value = _convert_time_to_minutes(value)
            except (IndexError, KeyError, ValueError):
                continue

        try:
            if name == "observation_time":
                value = _convert_time_to_minutes(value)
        except ValueError:
            continue

        description = ""
        try:
            float(value)
        except ValueError:
            description = f', description="{value}"'
            value = "1"

        if name not in already_seen:
            output.append(f"# HELP {name} {help}")
            already_seen.append(name)

        output.append(f'{name}{{forecast="{for_day}"{description}}} {value}')

    return "\n".join(output) + "\n"


def _convert_time_to_minutes(time_str):
    "Convert time from midnight to minutes"
    return (
        int(
            (
                datetime.strptime(time_str, "%I:%M %p")
                - datetime.strptime("12:00 AM", "%I:%M %p")
            ).total_seconds()
        )
        // 60
    )


def render_prometheus(data):
    """
    Convert `data` into Prometheus format
    and return it as string.
    """

    already_seen = []
    answer = _render_current(data["current_condition"][0], already_seen=already_seen)
    for i in range(3):
        answer += _render_current(
            data["weather"][i], for_day="%sd" % i, already_seen=already_seen
        )
    return answer