from collections import OrderedDict

from constants import SECRETS


def format_duration(duration: int, natural: bool = False, short: bool = False):
    def format_plural(noun, count):
        if short:
            return noun[0]
        return " " + (noun if count == 1 else noun + "s")

    segments = []

    weeks, duration = divmod(duration, 604800)
    if weeks > 0:
        segments.append(f"{weeks}{format_plural('week', weeks)}")

    days, duration = divmod(duration, 86400)
    if days > 0:
        segments.append(f"{days}{format_plural('day', days)}")

    hours, duration = divmod(duration, 3600)
    if hours > 0:
        segments.append(f"{hours}{format_plural('hour', hours)}")

    minutes, duration = divmod(duration, 60)
    if minutes > 0:
        segments.append(f"{minutes}{format_plural('minute', minutes)}")

    if duration > 0:
        segments.append(f"{duration}{format_plural('second', duration)}")

    separator = " " if short else ", "
    if not natural or len(segments) <= 1:
        return separator.join(segments)
    return separator.join(segments[:-1]) + f" and {segments[-1]}"


def filter_secrets(text: str, secrets=SECRETS) -> str:
    for secret_name, secret in secrets.items():
        if not secret:
            continue
        text = text.replace(secret, f"<{secret_name}>")
    return text


class LimitedSizeDict(OrderedDict):
    def __init__(self, *args, **kwargs):
        self.size_limit = kwargs.pop("size_limit", 1000)
        super().__init__(*args, **kwargs)
        self._check_size_limit()

    def __setitem__(self, key, value):
        super().__setitem__(key, value)
        self._check_size_limit()

    def _check_size_limit(self):
        if self.size_limit is not None:
            while len(self) > self.size_limit:
                self.popitem(last=False)