# This file is part of nose-perftest.
#
# Copyright (c) 2012, Eric Scrivner and AUTHORS
# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions are met:
#
# * Redistributions of source code must retain the above copyright notice, this
#   list of conditions and the following disclaimer.
# * Redistributions in binary form must reproduce the above copyright notice,
#   this list of conditions and the following disclaimer in the documentation
#   and/or other materials provided with the distribution.
# * Neither the name of the nose-perfdump nor the names of its contributors may be
#   used to endorse or promote products derived from this software without
#   specific prior written permission.
#
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
# POSSIBILITY OF SUCH DAMAGE.
from perfdump.models import TestTime, SetupTime


class HtmlReport(object):
    """Writes the performance report to an HTML file."""

    @classmethod
    def write(cls, html_file):
        """Writes the HTML report to the given file."""
        f = open(html_file, 'w')
        f.write('<html>')
        f.write('<head>')
        f.write('</head>')
        f.write('<body>')
        f.write('<h1>Test times</h1>')
        
        fmt_test = '<tr><td>{:.05f}</td><td>{}</td></tr><tr><td>&nbsp;</td><td>{}</td></tr>'

        f.write('<table>')
        f.write('<tr><th>Time</th><th>Test info</th></tr>')
        for row in TestTime.get_slowest_tests(10):
            f.write(fmt_test.format(row['elapsed'], row['file'], '{}.{}.{}'.format(row['module'], row['class'], row['func'])))
        f.write('</table>')


        fmt_file = '<tr><td>{:.05f}</td><td>{}</td></tr>'
        f.write('<table>')
        f.write('<tr><th>Time</th><th>Test info</th></tr>')
        for row in TestTime.get_slowest_files(10):
            f.write(fmt_file.format(row['sum_elapsed'], row['file']))
        f.write('</table>')

        
        f.write('<h1>Setup times</h1>')

        f.write('<table>')
        f.write('<tr><th>Time</th><th>Test info</th></tr>')
        for row in SetupTime.get_slowest_tests(10):
            f.write(fmt_test.format(row['elapsed'], row['file'], '{}.{}.{}'.format(row['module'], row['class'], row['func'])))
        f.write('</table>')


        f.write('<table>')
        f.write('<tr><th>Time</th><th>Test info</th></tr>')
        for row in SetupTime.get_slowest_files(10):
            f.write(fmt_file.format(row['sum_elapsed'], row['file']))
        f.write('</table>')

        
        f.write('</body>')
        f.write('</html>')

        f.close()
