"""
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': [.5,35, 1, 20, 3, 10.5], 'title': 'series 3'})
	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 '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",
		add_popups = True,
		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'), 'wb') as f:
			f.write(res)

if __name__ == '__main__':
	save_samples()
