# Copyright 2010-2020 Gentoo Authors
# Distributed under the terms of the GNU General Public License v2

import locale
import logging
import time

from portage import os, _unicode_decode
from portage.exception import PortageException
from portage.localization import _
from portage.output import EOutput
from portage.util import grabfile, writemsg_level


def have_english_locale():
    lang, enc = locale.getdefaultlocale()
    if lang is not None:
        lang = lang.lower()
        lang = lang.split("_", 1)[0]
    return lang is None or lang in ("c", "en")


def whenago(seconds):
    sec = int(seconds)
    mins = 0
    days = 0
    hrs = 0
    years = 0
    out = []

    if sec > 60:
        mins = sec // 60
        sec = sec % 60
    if mins > 60:
        hrs = mins // 60
        mins = mins % 60
    if hrs > 24:
        days = hrs // 24
        hrs = hrs % 24
    if days > 365:
        years = days // 365
        days = days % 365

    if years:
        out.append("%dy " % years)
    if days:
        out.append("%dd " % days)
    if hrs:
        out.append("%dh " % hrs)
    if mins:
        out.append("%dm " % mins)
    if sec:
        out.append("%ds " % sec)

    return "".join(out).strip()


def old_tree_timestamp_warn(portdir, settings):
    unixtime = time.time()
    default_warnsync = 30

    timestamp_file = os.path.join(portdir, "metadata/timestamp.x")
    try:
        lastsync = grabfile(timestamp_file)
    except PortageException:
        return False

    if not lastsync:
        return False

    lastsync = lastsync[0].split()
    if not lastsync:
        return False

    try:
        lastsync = int(lastsync[0])
    except ValueError:
        return False

    var_name = "PORTAGE_SYNC_STALE"
    try:
        warnsync = float(settings.get(var_name, default_warnsync))
    except ValueError:
        writemsg_level(
            f"!!! {var_name} contains non-numeric value: {settings[var_name]}\n",
            level=logging.ERROR,
            noiselevel=-1,
        )
        return False

    if warnsync <= 0:
        return False

    if (unixtime - 86400 * warnsync) > lastsync:
        out = EOutput()
        if have_english_locale():
            out.ewarn(f"Last emerge --sync was {whenago(unixtime - lastsync)} ago.")
        else:
            out.ewarn(
                _("Last emerge --sync was %s.")
                % _unicode_decode(time.strftime("%c", time.localtime(lastsync)))
            )
        return True
    return False
