# Copyright 2015 The Chromium OS Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

"""List compatible boards that we can pull prebuilts from."""

from __future__ import print_function

import os

from chromite.cbuildbot import binhost
from chromite.cbuildbot import constants
from chromite.lib import commandline
from chromite.lib import cros_build_lib


def _ParseArguments(argv):
  parser = commandline.ArgumentParser(description=__doc__)
  parser.add_argument('--buildroot', default=constants.SOURCE_ROOT,
                      help='Root directory where source is checked out to.')
  parser.add_argument('--prebuilt-type', required=True,
                      help='Type of prebuilt we want to look at.')
  parser.add_argument('--board', required=True,
                      help='Board to request prebuilts for.')
  opts = parser.parse_args(argv)
  opts.Freeze()
  return opts


def main(argv):
  cros_build_lib.AssertInsideChroot()
  opts = _ParseArguments(argv)
  filename = binhost.PrebuiltMapping.GetFilename(opts.buildroot,
                                                 opts.prebuilt_type)
  pfq_configs = binhost.PrebuiltMapping.Load(filename)
  extra_useflags = os.environ.get('USE', '').split()
  compat_id = binhost.CalculateCompatId(opts.board, extra_useflags)
  for key in pfq_configs.GetPrebuilts(compat_id):
    print(key.board)
