from svgwrite import Drawing

import os.path
from math import sqrt

def distance(p0, p1):
	return sqrt((p1[0] - p0[0]) ** 2 + (p1[1] - p0[1]) ** 2)

def color(rgb_value_tuple):
	return "rgb(%s,%s,%s)" % rgb_value_tuple

def get_writer(data, filename):
	return SVGWriter(data, filename)

class SVGWriter(object):
	PIXEL_SCALE = 40
	CURVE_COLOR = (255, 127, 0)
	def __init__(self, data, filename, scale = None, color = None):
		self.name = filename
		self.pixel_data = data
		if scale:
			self.PIXEL_SCALE = scale
		if color:
			self.CURVE_COLOR = color

	def scale_pt(self, pt, offset = (0,0)):
		return tuple(int((n+o) * self.PIXEL_SCALE) for n,o in zip(pt, offset))

	def output_image(self):
		filename = self.name
		# filename = filename+".svg"
		filename = os.path.join("outputs", "%s.%s" % (filename, "svg"))
		drawing = self.make_drawing(filename)
		self.draw_shapes(drawing)
		# self.insert_color(drawing)
		self.save_drawing(drawing, filename)

	def make_drawing(self, filename):
		return Drawing(filename)

	def save_drawing(self, drawing, filename):
		drawing.save()

	def draw_shapes(self, drawing):
		for shape in self.pixel_data.shapes:
			paths = getattr(shape, 'smooth_splines')
			self.draw_spline(drawing, paths, shape.value)

	def draw_spline(self, drawing, splines, fill):
		if fill==(255,255,255):
			return
		path = []
		# points = []
		for spline in splines:
			curves = list(spline.Quadratic_Bezier_Fit())
			path.append('M')
			path.append(self.scale_pt(curves[0][0]))
			for curve in curves:
				path.append('Q')
				path.append(self.scale_pt(curve[1]))
				path.append(self.scale_pt(curve[2]))
				p0 = self.scale_pt(curve[0])
				p1 = self.scale_pt(curve[2])
			path.append('Z')
		drawing.add(drawing.path(path, stroke = color(fill), fill = color(fill)))