# Copyright (c) 2011 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.

"""Django chart models for labtest report.

   Produce the data behind a google visualisation data table that can
   be rendered into a chart.

   Data entry points at this time include:
   -GetRangedLabTestReportData(): produce labtest execution data table.
"""

import json
import os

from autotest_lib.frontend.afe import readonly_connection

import autotest_lib.frontend.croschart.chartmodels as chartmodels
from autotest_lib.frontend.croschart.charterrors import ChartDBError
from autotest_lib.frontend.croschart.charterrors import ChartInputError

import gviz_api


###############################################################################
# Queries: These are designed as stateless functions with static relationships.
#          e.g. GetBuildRangedChartQuery() depends on
#               GetBasePerfQuery() for efficiency.
LABTEST_QUERY_TEMPLATE = """
SELECT job_name, job_owner,
       STR_TO_DATE(CONCAT(YEARWEEK(test_started_time), ' Sunday'), '%%X%%V %%W'),
       COUNT(*) AS test_count
FROM tko_test_view_2
WHERE job_owner != 'chromeos-test'
  AND NOT test_name REGEXP '(CLIENT|SERVER)_JOB.*'
  AND NOT test_name REGEXP 'boot\.[0-9]'
  AND NOT ISNULL(test_started_time)
  AND NOT ISNULL(test_finished_time)
  AND job_owner = LEFT(job_name, LENGTH(job_owner))
  %s
GROUP BY job_name, job_owner, YEARWEEK(test_started_time)"""


def GetBaseLabTestQuery(request):
  """Test query is simple with no parameters."""
  query = LABTEST_QUERY_TEMPLATE
  return query


###############################################################################
# Helpers
def GetKernelTeam():
  """Get Kernel team if requested."""
  kernel_team = None
  team_file = os.path.join(os.path.abspath(os.path.dirname(__file__)),
                          'kernel-team.json')
  if os.path.exists(team_file):
    kernel_team = json.load(open(team_file))
  return kernel_team


###############################################################################
# Models
def GetLabTestReportData(query):
  """Prepare and run the db query and massage the results."""

  def AggregateTests(data_list):
    """Groups multiple row data by test name and platform."""
    raw_data = []
    user_data = {}
    for job_name, job_owner, week_date, test_count in data_list:
      raw_data.append({'job_name': job_name,
                       'job_owner': job_owner,
                       'week_date': week_date,
                       'test_count': test_count})
      if not job_owner in user_data:
        user_data[job_owner] = {'job_owner': job_owner,
                                'test_count': test_count}
      else:
        user_data[job_owner]['test_count'] += test_count
    if not raw_data:
      raise ChartDBError('No data returned')
    # Add zero-values for members not found.
    kernel_team = GetKernelTeam()
    if kernel_team:
      for k in kernel_team:
        if not k in user_data:
          user_data[k] = {'job_owner': k, 'test_count': 0}
    return raw_data, sorted(user_data.values())

  def ToGVizJsonTable(table_data, user_table_data):
    """Massage data into gviz data table in proper order."""
    # Now format for gviz tables: jobs and users.
    description = {'job_name': ('string', 'Job'),
                   'job_owner': ('string', 'Owner'),
                   'week_date': ('string', 'Week'),
                   'test_count': ('number', '#Tests')}
    keys_in_order = ['job_name', 'job_owner', 'week_date', 'test_count']
    gviz_data_table_jobs = gviz_api.DataTable(description)
    gviz_data_table_jobs.LoadData(table_data)
    gviz_data_table_jobs = gviz_data_table_jobs.ToJSon(keys_in_order)

    description = {'job_owner': ('string', 'Owner'),
                   'test_count': ('number', '#Tests')}
    keys_in_order = ['job_owner', 'test_count']
    gviz_data_table_users = gviz_api.DataTable(description)
    gviz_data_table_users.LoadData(user_table_data)
    gviz_data_table_users = gviz_data_table_users.ToJSon(keys_in_order)
    return {'jobs': gviz_data_table_jobs, 'users': gviz_data_table_users}

  cursor = readonly_connection.connection().cursor()
  cursor.execute(query)
  test_data, user_data = AggregateTests(cursor.fetchall())
  gviz_data_table = ToGVizJsonTable(test_data, user_data)
  return {'gviz_data_table': gviz_data_table}


def GetRangedLabTestReportData(request):
  """Prepare and run the db query and massage the results."""
  ranged_queries = {'from_date': chartmodels.GetDateRangedChartQuery,
                    'interval': chartmodels.GetIntervalRangedChartQuery}
  for range_key in ['from_date', 'interval', None]:
    if request.GET.get(range_key, None):
      break
  if not range_key:
    raise ChartInputError('One interval-type parameter must be supplied.')
  query = GetBaseLabTestQuery(request) % (ranged_queries[range_key](request))
  data_dict = GetLabTestReportData(query)
  return data_dict
