#!/usr/bin/env python
#-*- coding: utf-8 -*-
#  Copyright (c) 2012 The WebRTC project authors. All Rights Reserved.
#
#  Use of this source code is governed by a BSD-style license
#  that can be found in the LICENSE file in the root of the source
#  tree. An additional intellectual property rights grant can be found
#  in the file PATENTS.  All contributing project authors may
#  be found in the AUTHORS file in the root of the source tree.

"""Implements the quality tracker dashboard and reporting facilities."""

__author__ = 'phoglund@webrtc.org (Patrik Höglund)'

from google.appengine.ext.webapp import template
import webapp2

import add_build_status_data
import add_coverage_data
import load_build_status
import load_coverage


class ShowDashboard(webapp2.RequestHandler):
  """Shows the dashboard page.

     The page is shown by grabbing data we have stored previously
     in the App Engine database using the AddCoverageData handler.
  """

  def get(self):
    build_status_loader = load_build_status.BuildStatusLoader()
    build_status_data = build_status_loader.load_build_status_data()
    last_updated_at = build_status_loader.load_last_modified_at()
    if last_updated_at is None:
      self._show_error_page("No data has yet been uploaded to the dashboard.")
      return

    last_updated_at = last_updated_at.strftime("%Y-%m-%d %H:%M")
    lkgr = build_status_loader.compute_lkgr()

    coverage_loader = load_coverage.CoverageDataLoader()
    coverage_json_data = coverage_loader.load_coverage_json_data()

    page_template_filename = 'templates/dashboard_template.html'
    self.response.write(template.render(page_template_filename, vars()))

  def _show_error_page(self, error_message):
    self.response.write('<html><body>%s</body></html>' % error_message)


app = webapp2.WSGIApplication([('/', ShowDashboard),
                               ('/add_coverage_data',
                                add_coverage_data.AddCoverageData),
                               ('/add_build_status_data',
                                add_build_status_data.AddBuildStatusData)],
                              debug=True)
