package main

import (
	"os"

	svg "github.com/ajstarks/svgo/float"
	"gopkg.in/alecthomas/kingpin.v2"
)

var (
	iterations = kingpin.Flag("iterations", "number of layers to recurse down").Short('i').Int()
	sqrt3      = 1.7320508075688772
	tsf        = 2.0 //triforce scaling factor
)

type Triangle struct {
	x1     float64
	y1     float64
	length float64
	color  string
}

func NewTriangle(x1 float64, y1 float64, length float64) *Triangle {
	return &Triangle{
		x1:     x1,
		y1:     y1,
		length: length,
	}
}

//GetCoordinates returns a list of x and y coordinates
func (t *Triangle) GetCoordinates() ([]float64, []float64) {
	x := make([]float64, 3)
	y := make([]float64, 3)

	x[0] = t.x1
	x[1] = t.x1 + (t.length / 2.0)
	x[2] = t.x1 - (t.length / 2.0)

	y[0] = t.y1
	y[1] = t.y1 + (sqrt3/2.0)*t.length
	y[2] = t.y1 + (sqrt3/2.0)*t.length
	return x, y
}

func (t *Triangle) GetLowerRight() *Triangle {
	return NewTriangle(t.x1+(t.length/2.0), t.y1+(sqrt3/2.0)*t.length, t.length/2)
}

func (t *Triangle) GetLowerLeft() *Triangle {
	return NewTriangle(t.x1-(t.length/2.0), t.y1+(sqrt3/2.0)*t.length, t.length/2)
}

//Triforce scales and triplicates the input triangle
func (t *Triangle) Triforce(scalingFactor ...float64) []Triangle {
	ts := tsf
	if len(scalingFactor) > 0 {
		ts = scalingFactor[0]
	}
	return []Triangle{
		// upper triangle
		Triangle{
			x1:     t.x1,
			y1:     t.y1,
			length: (t.length / ts),
			color:  "fill:white",
		},
		// lower left
		Triangle{
			x1:     t.x1 - t.length/(ts*2.0),
			y1:     t.y1 + (t.length/ts)*(sqrt3/2.0),
			length: t.length / ts,
			color:  "fill:white",
		},
		// lower right
		Triangle{
			x1:     t.x1 + t.length/(ts*2.0),
			y1:     t.y1 + (t.length/ts)*(sqrt3/2.0),
			length: (t.length / ts),
			color:  "fill:white",
		},
	}
}

func iterate(triangle *Triangle, ts []Triangle, iter int) []Triangle {
	if iter <= 0 {
		return append(ts, triangle.Triforce(1)...)
	}
	answer := []Triangle{}
	answer = append(ts, triangle.Triforce(2)...)
	answer = append(answer, iterate(triangle.GetLowerLeft(), ts, iter-1)...)
	answer = append(answer, iterate(triangle.GetLowerRight(), ts, iter-1)...)
	return answer
}

func main() {
	kingpin.Version("0.1.0")
	kingpin.Parse()
	width := 256.0
	height := 256.0
	canvas := svg.New(os.Stdout)
	canvas.Start(width, height)

	t := NewTriangle(float64(width/2.0), 0.0, float64(width/2.0))
	ts := []Triangle{}
	ts = iterate(t, ts, 2)

	for _, t := range ts {
		x, y := t.GetCoordinates()
		canvas.Polygon(x, y, t.color)
		//canvas.Text(t.x1, t.y1+(t.length/1.5), t.label, fmt.Sprintf("text-anchor:middle;font-size:%vpx;fill:white", t.length/10))
	}

	canvas.End()
}
