# -*- coding: utf-8 -*-
# Copyright 2016 The ChromiumOS Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

"""Text templates used by various parts of results_report."""
from __future__ import print_function

import html
from string import Template

_TabMenuTemplate = Template("""
<div class='tab-menu'>
  <a href="javascript:switchTab('$table_name', 'html')">HTML</a>
  <a href="javascript:switchTab('$table_name', 'text')">Text</a>
  <a href="javascript:switchTab('$table_name', 'tsv')">TSV</a>
</div>""")


def _GetTabMenuHTML(table_name):
  # N.B. cgi.escape does some very basic HTML escaping. Nothing more.
  escaped = html.escape(table_name)
  return _TabMenuTemplate.substitute(table_name=escaped)


_ExperimentFileHTML = """
<div class='results-section'>
  <div class='results-section-title'>Experiment File</div>
  <div class='results-section-content'>
    <pre>%s</pre>
</div>
"""


def _GetExperimentFileHTML(experiment_file_text):
  if not experiment_file_text:
    return ''
  return _ExperimentFileHTML % (html.escape(experiment_file_text, quote=False),)


_ResultsSectionHTML = Template("""
<div class='results-section'>
  <div class='results-section-title'>$sect_name</div>
  <div class='results-section-content'>
    <div id='${short_name}-html'>$html_table</div>
    <div id='${short_name}-text'><pre>$text_table</pre></div>
    <div id='${short_name}-tsv'><pre>$tsv_table</pre></div>
  </div>
  $tab_menu
</div>
""")


def _GetResultsSectionHTML(print_table, table_name, data):
  first_word = table_name.strip().split()[0]
  short_name = first_word.lower()
  return _ResultsSectionHTML.substitute(
      sect_name=table_name,
      html_table=print_table(data, 'HTML'),
      text_table=print_table(data, 'PLAIN'),
      tsv_table=print_table(data, 'TSV'),
      tab_menu=_GetTabMenuHTML(short_name),
      short_name=short_name)


_MainHTML = Template("""
<html>
<head>
  <style type="text/css">
    body {
      font-family: "Lucida Sans Unicode", "Lucida Grande", Sans-Serif;
      font-size: 12px;
    }

    pre {
      margin: 10px;
      color: #039;
      font-size: 14px;
    }

    .chart {
      display: inline;
    }

    .hidden {
      visibility: hidden;
    }

    .results-section {
      border: 1px solid #b9c9fe;
      margin: 10px;
    }

    .results-section-title {
      background-color: #b9c9fe;
      color: #039;
      padding: 7px;
      font-size: 14px;
      width: 200px;
    }

    .results-section-content {
      margin: 10px;
      padding: 10px;
      overflow:auto;
    }

    #box-table-a {
      font-size: 12px;
      width: 480px;
      text-align: left;
      border-collapse: collapse;
    }

    #box-table-a th {
      padding: 6px;
      background: #b9c9fe;
      border-right: 1px solid #fff;
      border-bottom: 1px solid #fff;
      color: #039;
      text-align: center;
    }

    #box-table-a td {
      padding: 4px;
      background: #e8edff;
      border-bottom: 1px solid #fff;
      border-right: 1px solid #fff;
      color: #669;
      border-top: 1px solid transparent;
    }

    #box-table-a tr:hover td {
      background: #d0dafd;
      color: #339;
    }

  </style>
  <script type='text/javascript' src='https://www.google.com/jsapi'></script>
  <script type='text/javascript'>
    google.load('visualization', '1', {packages:['corechart']});
    google.setOnLoadCallback(init);
    function init() {
      switchTab('summary', 'html');
      ${perf_init};
      switchTab('full', 'html');
      drawTable();
    }
    function drawTable() {
      ${chart_js};
    }
    function switchTab(table, tab) {
      document.getElementById(table + '-html').style.display = 'none';
      document.getElementById(table + '-text').style.display = 'none';
      document.getElementById(table + '-tsv').style.display = 'none';
      document.getElementById(table + '-' + tab).style.display = 'block';
    }
  </script>
</head>

<body>
  $summary_table
  $perf_html
  <div class='results-section'>
    <div class='results-section-title'>Charts</div>
    <div class='results-section-content'>$chart_divs</div>
  </div>
  $full_table
  $experiment_file
</body>
</html>
""")


# It's a bit ugly that we take some HTML things, and some non-HTML things, but I
# need to balance prettiness with time spent making things pretty.
def GenerateHTMLPage(perf_table, chart_js, summary_table, print_table,
                     chart_divs, full_table, experiment_file):
  """Generates a crosperf HTML page from the given arguments.

  print_table is a two-arg function called like: print_table(t, f)
    t is one of [summary_table, print_table, full_table]; it's the table we want
      to format.
    f is one of ['TSV', 'HTML', 'PLAIN']; it's the type of format we want.
  """
  summary_table_html = _GetResultsSectionHTML(print_table, 'Summary Table',
                                              summary_table)
  if perf_table:
    perf_html = _GetResultsSectionHTML(print_table, 'Perf Table', perf_table)
    perf_init = "switchTab('perf', 'html')"
  else:
    perf_html = ''
    perf_init = ''

  full_table_html = _GetResultsSectionHTML(print_table, 'Full Table',
                                           full_table)
  experiment_file_html = _GetExperimentFileHTML(experiment_file)
  return _MainHTML.substitute(
      perf_init=perf_init,
      chart_js=chart_js,
      summary_table=summary_table_html,
      perf_html=perf_html,
      chart_divs=chart_divs,
      full_table=full_table_html,
      experiment_file=experiment_file_html)
