# Copyright 2022 The ChromiumOS Authors
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

"""Locates past-AUE overlay candidates."""

import datetime

from chromite.lib import commandline
from chromite.lib import constants
from chromite.lib import cros_build_lib
from chromite.lib import portage_util


_QUERY = """
SELECT buildTargets, aueDate
FROM chromeos_build_release_data.device_live_builds
WHERE buildTargets IS NOT NULL
    AND aueDate IS NOT NULL
    AND EXTRACT(YEAR FROM aueDate) > 2000
GROUP BY buildTargets, aueDate ORDER BY aueDate;"""


def get_parser():
    """Build the argument parser."""
    parser = commandline.ArgumentParser(description=__doc__)

    return parser


def _parse_arguments(argv):
    """Parse and validate arguments."""
    parser = get_parser()
    opts = parser.parse_args(argv)

    opts.Freeze()
    return opts


def main(argv) -> None:
    _ = _parse_arguments(argv)

    result = cros_build_lib.run(
        ["dremel", "--output", "csv"],
        input=_QUERY,
        capture_output=True,
        encoding="utf-8",
    )

    # TODO: Parse the parent config for the overlays to allow determining
    #  actual usages, and then also check for overlays with no usages and
    #  overlays with missing parents.
    now = datetime.datetime.now()
    overlays = portage_util.FindOverlays(constants.BOTH_OVERLAYS)
    overlay_names = {portage_util.GetOverlayName(x): x for x in overlays}
    aue_overlays = []
    lines = [x for x in result.stdout.splitlines() if x]
    for line in lines[1:]:
        build_target, aue_date_str = line.split(",")
        aue_date = datetime.datetime.strptime(
            aue_date_str.split("+")[0], "%Y-%m-%d %H:%M:%S"
        )

        if aue_date > now:
            continue

        for k in overlay_names:
            # Check if the build target is in the name to catch variants.
            # TODO: Use the parent configs instead.
            if build_target in k:
                aue_overlays.append(
                    (build_target, aue_date_str, k, overlay_names[k])
                )

    if not aue_overlays:
        print("No candidates found.")
        return

    lines = ["\t".join(x) for x in aue_overlays]
    print("Found AUE boards:")
    print("\n".join(lines))
