# -*- coding: utf-8 -*-
# Copyright 2016 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.

"""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)
