"""
Samples of the various charts. Run this script to generate the reference
samples.
"""

import os

from svg.charts.plot import Plot
from svg.charts import bar
from svg.charts import time_series
from svg.charts import pie
from svg.charts import schedule
from svg.charts import line


def sample_Plot():
    g = Plot(
        {
            'min_x_value': 0,
            'min_y_value': 0,
            'area_fill': True,
            'stagger_x_labels': True,
            'stagger_y_labels': True,
            'show_x_guidelines': True,
        }
    )
    g.add_data({'data': [[1, 25], [2, 30], [3, 45]], 'title': 'series 1'})
    g.add_data({'data': [[1, 30], [2, 31], [3, 40]], 'title': 'series 2'})
    g.add_data({'data': [[0.5, 35], [1, 20], [3, 10.5]], 'title': 'series 3'})
    return g


def sample_PlotTextLabels():
    g = Plot(
        {
            'draw_lines_between_points': False,
            'min_x_value': 0,
            'min_y_value': 0,
            'show_x_guidelines': True,
        }
    )
    # Processed Apple production 2015
    # Any object with a .text attribute will do;
    # we like namedtuple().

    from collections import namedtuple

    Datum = namedtuple("Datum", "x y text")

    g.add_data(
        {
            'data': [
                Datum(8.24, 80.85, 'ES'),
                Datum(0.17, 6.73, 'IE'),
                Datum(0, 0, 'IS'),
            ],
            'title': 'Processed Apple',
        }
    )
    return g


def sample_TimeSeries():
    g = time_series.Plot({})

    g.timescale_divisions = '4 hours'
    g.stagger_x_labels = True
    g.x_label_format = '%d-%b %H:%M'
    # g.max_y_value = 200

    g.add_data(
        {
            'data': ['2005-12-21T00:00:00', 20, '2005-12-22T00:00:00', 21],
            'title': 'series 1',
        }
    )

    return g


def generate_samples():
    yield 'Plot', sample_Plot()
    yield 'PlotTextLabels', sample_PlotTextLabels()
    yield 'TimeSeries', sample_TimeSeries()
    yield 'VerticalBar', SampleBar.vertical()
    yield 'HorizontalBar', SampleBar.horizontal()
    yield 'VerticalBarLarge', SampleBar.vertical_large()
    yield 'VerticalBarStackTop', SampleBar.vertical_top()
    yield 'Pie', sample_Pie()
    yield 'Schedule', sample_Schedule()
    yield 'Line', sample_Line()


class SampleBar:
    fields = ['Internet', 'TV', 'Newspaper', 'Magazine', 'Radio']

    @classmethod
    def vertical(cls):

        g = bar.VerticalBar(cls.fields)

        g.stack = 'side'
        g.scale_integers = True
        g.width, g.height = 640, 480
        g.graph_title = 'Question 7'
        g.show_graph_title = True

        g.add_data({'data': [-2, 3, 1, 3, 1], 'title': 'Female'})
        g.add_data({'data': [0, 2, 1, 5, 4], 'title': 'Male'})

        return g

    @classmethod
    def horizontal(cls):
        g = bar.HorizontalBar(cls.fields)

        g.stack = 'side'
        g.scale_integers = True
        g.width, g.height = 640, 480
        g.graph_title = 'Question 7'
        g.show_graph_title = True

        g.add_data({'data': [-2, 3, 1, 3, 1], 'title': 'Female'})
        g.add_data({'data': [0, 2, 1, 5, 4], 'title': 'Male'})

        return g

    @classmethod
    def vertical_large(cls):
        g = bar.VerticalBar(cls.fields)
        options = dict(
            scale_integers=True,
            stack='side',
            width=640,
            height=480,
            graph_title='Question 8',
            show_graph_title=True,
            no_css=False,
        )
        g.__dict__.update(options)

        g.add_data(dict(data=[2, 22, 98, 143, 82], title='intermediate'))
        g.add_data(dict(data=[2, 26, 106, 193, 105], title='old'))
        return g

    @classmethod
    def vertical_top(cls):
        g = bar.VerticalBar(cls.fields, dict(stack='top'))
        assert g.stack == 'top'

        g.scale_integers = True
        g.width, g.height = 640, 480
        g.graph_title = 'Question 7'
        g.show_graph_title = True

        g.add_data({'data': [-2, 3, 1, 3, 1], 'title': 'Female'})
        g.add_data({'data': [0, 2, 1, 5, 4], 'title': 'Male'})

        return g


def sample_Line():
    g = line.Line()
    options = dict(
        scale_integers=True,
        area_fill=True,
        width=640,
        height=480,
        fields=SampleBar.fields,
        graph_title='Question 7',
        show_graph_title=True,
        no_css=False,
    )
    g.__dict__.update(options)
    g.add_data({'data': [-2, 3, 1, 3, 1], 'title': 'Female'})
    g.add_data({'data': [0, 2, 1, 5, 4], 'title': 'Male'})
    return g


def sample_Pie():
    g = pie.Pie({})
    options = dict(
        width=640,
        height=480,
        fields=SampleBar.fields,
        graph_title='Question 7',
        expand_greatest=True,
        show_data_labels=True,
    )
    g.__dict__.update(options)
    g.add_data({'data': [-2, 3, 1, 3, 1], 'title': 'Female'})
    g.add_data({'data': [0, 2, 1, 5, 4], 'title': 'Male'})
    return g


def sample_Schedule():
    title = "Billy's Schedule"
    data1 = [
        "History 107",
        "5/19/04",
        "6/30/04",
        "Algebra 011",
        "6/2/04",
        "8/11/04",
        "Psychology 101",
        "6/28/04",
        "8/9/04",
        "Acting 105",
        "7/7/04",
        "8/16/04",
    ]

    g = schedule.Schedule(
        dict(
            width=640,
            height=480,
            graph_title=title,
            show_graph_title=True,
            key=False,
            scale_x_integers=True,
            scale_y_integers=True,
            show_data_labels=True,
            show_y_guidelines=False,
            show_x_guidelines=True,
            # show_x_title=True, # not yet implemented
            x_title="Time",
            show_y_title=False,
            rotate_x_labels=True,
            rotate_y_labels=False,
            x_label_format="%m/%d",
            timescale_divisions="1 week",
            popup_format="%m/%d/%y",
            area_fill=True,
            min_y_value=0,
        )
    )

    g.add_data(dict(data=data1, title="Data"))

    return g


def save_samples():
    root = os.path.dirname(__file__)
    for sample_name, sample in generate_samples():
        res = sample.burn()
        with open(os.path.join(root, sample_name + '.py.svg'), 'w') as f:
            f.write(res)


if __name__ == '__main__':
    save_samples()
