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

__all__ = ["deprecated_profile_check"]


import portage
from portage import os, _encodings, _unicode_encode
from portage.const import DEPRECATED_PROFILE_FILE
from portage.localization import _
from portage.output import colorize
from portage.util import writemsg


def deprecated_profile_check(settings=None):
    config_root = None
    eprefix = None
    deprecated_profile_file = None
    if settings is not None:
        config_root = settings["PORTAGE_CONFIGROOT"]
        eprefix = settings["EPREFIX"]
        for x in reversed(settings._locations_manager.profiles_complex):
            if x.show_deprecated_warning:
                deprecated_profile_file = os.path.join(x.location, "deprecated")
                if os.access(deprecated_profile_file, os.R_OK):
                    break
        else:
            deprecated_profile_file = None

    if deprecated_profile_file is None:
        deprecated_profile_file = os.path.join(
            config_root or "/", DEPRECATED_PROFILE_FILE
        )
        if not os.access(deprecated_profile_file, os.R_OK):
            deprecated_profile_file = os.path.join(
                config_root or "/", "etc", "make.profile", "deprecated"
            )
            if not os.access(deprecated_profile_file, os.R_OK):
                return

    with open(
        _unicode_encode(
            deprecated_profile_file, encoding=_encodings["fs"], errors="strict"
        ),
        encoding=_encodings["content"],
        errors="replace",
    ) as f:
        dcontent = f.readlines()
    writemsg(
        colorize(
            "BAD",
            _("\n!!! Your current profile is " "deprecated and not supported anymore."),
        )
        + "\n",
        noiselevel=-1,
    )
    writemsg(
        colorize("BAD", _("!!! Use eselect profile to update your " "profile.")) + "\n",
        noiselevel=-1,
    )
    if not dcontent:
        writemsg(
            colorize("BAD", _("!!! Please refer to the " "Gentoo Upgrading Guide."))
            + "\n",
            noiselevel=-1,
        )
        return True
    newprofile = dcontent[0].rstrip("\n")
    writemsg(
        colorize(
            "BAD", _("!!! Please upgrade to the " "following profile if possible:")
        )
        + "\n\n",
        noiselevel=-1,
    )
    writemsg(8 * " " + colorize("GOOD", newprofile) + "\n\n", noiselevel=-1)
    if len(dcontent) > 1:
        writemsg(_("To upgrade do the following steps:\n"), noiselevel=-1)
        for myline in dcontent[1:]:
            writemsg(myline, noiselevel=-1)
        writemsg("\n\n", noiselevel=-1)
    else:
        writemsg(_("You may use the following command to upgrade:\n\n"), noiselevel=-1)
        writemsg(
            8 * " " + colorize("INFORM", "eselect profile set " + newprofile) + "\n\n",
            noiselevel=-1,
        )

    if settings is not None:
        main_repo_loc = settings.repositories.mainRepoLocation()
        new_profile_path = os.path.join(
            main_repo_loc, "profiles", newprofile.rstrip("\n")
        )

        if os.path.isdir(new_profile_path):
            new_config = portage.config(
                config_root=config_root,
                config_profile_path=new_profile_path,
                eprefix=eprefix,
            )

            if not new_config.profiles:
                writemsg(
                    "\n %s %s\n"
                    % (
                        colorize("WARN", "*"),
                        _(
                            "You must update portage before you "
                            "can migrate to the above profile."
                        ),
                    ),
                    noiselevel=-1,
                )
                writemsg(
                    " %s %s\n\n"
                    % (
                        colorize("WARN", "*"),
                        _(
                            "In order to update portage, "
                            "run 'emerge --oneshot sys-apps/portage'."
                        ),
                    ),
                    noiselevel=-1,
                )

    return True
