#!/usr/bin/python3

"""Generate a graph of the performance numbers, using pychart."""

from __future__ import print_function

import dbm

import pychart


def get_timing(kind):
    """Inhale performance numbers for 'kind' from database."""
    database = dbm.open('performance-numbers', 'r')
    list_ = []
    for key in database.keys():
        fields = key.split()
        if fields[0] == kind:
            set_size = float(fields[1])
            duration = float(database[key])
            list_.append((set_size, duration))
    database.close()
    list_.sort()
    return list_


def get_hybrid_timing():
    """Get hybrid backend numbers."""
    return get_timing('hybrid')


def get_array_timing():
    """Get array backend numbers."""
    return get_timing('array')


def get_seek_timing():
    """Get seek backend numbers."""
    return get_timing('seek')


def get_mmap_timing():
    """Get mmap backend numbers."""
    return get_timing('mmap')


def desired_y_max(*list_):
    """Calculate the maximum duration for y."""
    maximum = 0.0
    for element in list_:
        for set_size, duration in element:
            maximum = max(duration, maximum)
    return maximum


def main():
    """Start the ball rolling."""
    pychart.theme.get_options()
    pychart.theme.output_format = 'pdf'
    pychart.theme.use_color = 1
    pychart.theme.output_file = 'performance-graph.pdf'
    pychart.theme.default_font_size = 15
    pychart.theme.reinitialize()

    width = 800
    height = width * 4 // 5
    size = (width, height)

    hybrid_timing_data = get_hybrid_timing()
    print('hybrid', hybrid_timing_data)
    array_timing_data = get_array_timing()
    print('array', array_timing_data)
    seek_timing_data = get_seek_timing()
    print('seek', seek_timing_data)
    mmap_timing_data = get_mmap_timing()
    print('mmap', mmap_timing_data)

    y_max = desired_y_max(array_timing_data, seek_timing_data, hybrid_timing_data, mmap_timing_data)

    # can = pychart.canvas.default_canvas()

    ar = pychart.area.T(
        size=size,
        legend=pychart.legend.T(),
        x_range=(1, None),
        y_range=(0.0001, y_max + 100),
        x_coord=pychart.linear_coord.T(),
        y_coord=pychart.linear_coord.T(),
        x_axis=pychart.axis.X(format="%g", label="Number of elements in set"),
        y_axis=pychart.axis.Y(format="%g", label="Seconds"),
        )

    lp = pychart.line_plot.T(data=array_timing_data, label="Array")
    ar.add_plot(lp)

    lp = pychart.line_plot.T(data=seek_timing_data, label="Seek")
    ar.add_plot(lp)

    lp = pychart.line_plot.T(data=hybrid_timing_data, label="Hybrid")
    ar.add_plot(lp)

    lp = pychart.line_plot.T(data=mmap_timing_data, label="mmap")
    ar.add_plot(lp)

    ar.draw()


main()