#!/usr/bin/python
#
# Copyright 2011 Google Inc. All Rights Reserved.

__author__ = 'kbaclawski@google.com (Krystian Baclawski)'

import logging
import optparse
import pickle
import sys
import xmlrpclib

from automation.clients.helper import crosstool
from automation.common import job_group
from automation.common import logger


class CrosstoolNightlyClient(object):
  VALID_TARGETS = ['gcc-4.6.x-ubuntu_lucid-arm',
                   'gcc-4.6.x-ubuntu_lucid-x86_64',
                   'gcc-4.6.x-grtev2-armv7a-vfpv3.d16-hard',
                   'gcc-4.6.x-glibc-2.11.1-grte',
                   'gcc-4.6.x-glibc-2.11.1-powerpc']
  VALID_BOARDS = ['qemu', 'pandaboard', 'unix']

  def __init__(self, target, boards):
    assert target in self.VALID_TARGETS
    assert all(board in self.VALID_BOARDS for board in boards)

    self._target = target
    self._boards = boards

  def Run(self):
    server = xmlrpclib.Server('http://localhost:8000')
    server.ExecuteJobGroup(pickle.dumps(self.CreateJobGroup()))

  def CreateJobGroup(self):
    factory = crosstool.JobsFactory()

    checkout_crosstool_job, checkout_dir, manifests_dir = \
        factory.CheckoutCrosstool(self._target)

    all_jobs = [checkout_crosstool_job]

    # Build crosstool target
    build_release_job, build_tree_dir = factory.BuildRelease(
        checkout_dir, self._target)
    all_jobs.append(build_release_job)

    testruns = []

    # Perform crosstool tests
    for board in self._boards:
      for component in ('gcc', 'binutils'):
        test_job, testrun_dir = factory.RunTests(
            checkout_dir, build_tree_dir, self._target, board, component)
        all_jobs.append(test_job)
        testruns.append(testrun_dir)

    if testruns:
      all_jobs.append(factory.GenerateReport(testruns, manifests_dir,
                                             self._target, self._boards))

    return job_group.JobGroup(
        'Crosstool Nightly Build (%s)' % self._target, all_jobs, True, False)


@logger.HandleUncaughtExceptions
def Main(argv):
  valid_boards_string = ', '.join(CrosstoolNightlyClient.VALID_BOARDS)

  parser = optparse.OptionParser()
  parser.add_option('-b',
                    '--board',
                    dest='boards',
                    action='append',
                    choices=CrosstoolNightlyClient.VALID_BOARDS,
                    default=[],
                    help=('Run DejaGNU tests on selected boards: %s.' %
                          valid_boards_string))
  options, args = parser.parse_args(argv)

  if len(args) == 2:
    target = args[1]
  else:
    logging.error('Exactly one target required as a command line argument!')
    logging.info('List of valid targets:')
    for pair in enumerate(CrosstoolNightlyClient.VALID_TARGETS, start=1):
      logging.info('%d) %s' % pair)
    sys.exit(1)

  option_list = [opt.dest for opt in parser.option_list if opt.dest]

  kwargs = dict((option, getattr(options, option)) for option in option_list)

  client = CrosstoolNightlyClient(target, **kwargs)
  client.Run()


if __name__ == '__main__':
  logger.SetUpRootLogger(level=logging.DEBUG, display_flags={'name': False})
  Main(sys.argv)
