package main

import (
	"image/color"
	"log"
	"math"

	"github.com/tfriedel6/canvas"
	"github.com/tfriedel6/canvas/sdlcanvas"
)

func main() {
	wnd, cv, err := sdlcanvas.CreateWindow(1280, 720, "Canvas Example")
	if err != nil {
		log.Println(err)
		return
	}
	defer wnd.Destroy()

	lg := canvas.NewLinearGradient(320, 200, 480, 520)
	lg.AddColorStop(0, "#ff000040")
	lg.AddColorStop(1, "#00ff0040")
	lg.AddColorStop(0.5, "#0000ff40")

	rg := canvas.NewRadialGradient(540, 300, 80, 740, 300, 100)
	rg.AddColorStop(0, "#ff0000")
	rg.AddColorStop(1, "#00ff00")
	rg.AddColorStop(0.5, "#0000ff")

	wnd.MainLoop(func() {
		w, h := float64(cv.Width()), float64(cv.Height())

		// Clear the screen
		cv.SetFillStyle("#000")
		cv.FillRect(0, 0, w, h)

		// Draw lines with different colors and line thickness
		for x := 1.0; x < 10.5; x += 1.0 {
			cv.SetStrokeStyle(int(x*25), 255, 255)
			cv.SetLineWidth(x)
			cv.BeginPath()
			cv.MoveTo(x*10+20, 20)
			cv.LineTo(x*10+20, 120)
			cv.Stroke()
		}

		// Draw a path
		cv.BeginPath()
		cv.MoveTo(160, 20)
		cv.LineTo(180, 20)
		cv.LineTo(180, 40)
		cv.LineTo(200, 40)
		cv.LineTo(200, 60)
		cv.LineTo(220, 60)
		cv.LineTo(220, 80)
		cv.LineTo(240, 80)
		cv.LineTo(240, 100)
		cv.LineTo(260, 100)
		cv.LineTo(260, 120)
		cv.ArcTo(160, 120, 160, 100, 20)
		cv.ClosePath()
		cv.SetStrokeStyle(color.RGBA{R: 255, G: 128, B: 128, A: 255})
		cv.SetLineWidth(4)
		cv.Stroke()

		// Fill a polygon
		cv.BeginPath()
		cv.MoveTo(300, 20)
		cv.LineTo(340, 20)
		cv.QuadraticCurveTo(370, 20, 370, 50)
		cv.QuadraticCurveTo(370, 80, 400, 80)
		cv.LineTo(400, 80)
		cv.LineTo(400, 120)
		cv.LineTo(360, 120)
		cv.BezierCurveTo(330, 120, 330, 80, 300, 80)
		cv.ClosePath()
		cv.SetFillStyle(color.RGBA{R: 128, G: 255, B: 128, A: 255})
		cv.Fill()

		// Draw with alpha
		cv.SetGlobalAlpha(0.5)
		cv.SetFillStyle("#FF0000")
		cv.BeginPath()
		cv.Arc(100, 275, 60, 0, math.Pi*2, false)
		cv.Fill()
		cv.SetFillStyle("#00FF00")
		cv.BeginPath()
		cv.Arc(140, 210, 60, 0, math.Pi*2, false)
		cv.Fill()
		cv.SetFillStyle("#0000FF")
		cv.BeginPath()
		cv.Arc(180, 275, 60, 0, math.Pi*2, false)
		cv.Fill()
		cv.SetGlobalAlpha(1)

		// Clipped drawing
		cv.Save()
		cv.BeginPath()
		cv.Arc(340, 240, 80, 0, math.Pi*2, true)
		cv.Clip()
		cv.SetStrokeStyle(0, 255, 0)
		for x := 1.0; x < 12.5; x += 1.0 {
			cv.BeginPath()
			cv.MoveTo(260, 140+16*x)
			cv.LineTo(420, 140+16*x)
			cv.Stroke()
		}
		cv.SetFillStyle(0, 0, 255)
		for x := 1.0; x < 12.5; x += 1.0 {
			cv.FillRect(246+x*14, 150, 6, 180)
		}
		cv.Restore()

		// Draw images
		cv.DrawImage("cat.jpg", 480, 40, 320, 265)

		// Draw text
		cv.SetFont("Righteous-Regular.ttf", 40)
		cv.FillText("<-- Cat", 820, 180)
	})
}
