package main

import (
	"bytes"
	"fmt"
	"image/color"
	"io"

	staticMap "github.com/Luzifer/go-staticmaps"
	"github.com/fogleman/gg"
	"github.com/golang/geo/s2"
)

var markerColors = map[string]color.Color{
	"black":  color.RGBA{R: 145, G: 145, B: 145, A: 0xff},
	"brown":  color.RGBA{R: 178, G: 154, B: 123, A: 0xff},
	"green":  color.RGBA{R: 168, G: 196, B: 68, A: 0xff},
	"purple": color.RGBA{R: 177, G: 150, B: 191, A: 0xff},
	"yellow": color.RGBA{R: 237, G: 201, B: 107, A: 0xff},
	"blue":   color.RGBA{R: 163, G: 196, B: 253, A: 0xff},
	"gray":   color.RGBA{R: 204, G: 204, B: 204, A: 0xff},
	"orange": color.RGBA{R: 229, G: 165, B: 68, A: 0xff},
	"red":    color.RGBA{R: 246, G: 118, B: 112, A: 0xff},
	"white":  color.RGBA{R: 245, G: 244, B: 241, A: 0xff},
}

type markerSize float64

var markerSizes = map[string]markerSize{
	"tiny":  10,
	"mid":   15,
	"small": 20,
}

type marker struct {
	pos   s2.LatLng
	color color.Color
	size  markerSize
}

func (m marker) String() string {
	r, g, b, a := m.color.RGBA()
	return fmt.Sprintf("%s|%.0f|%d,%d,%d,%d", m.pos.String(), m.size, r, g, b, a)
}

func generateMap(center s2.LatLng, zoom int, marker []marker, x, y int, disableAttribution bool) (io.Reader, error) {
	ctx := staticMap.NewContext()
	ctx.SetUserAgent(fmt.Sprintf("Mozilla/5.0+(compatible; staticmap/%s; https://github.com/Luzifer/staticmap)", version))

	ctx.SetSize(x, y)
	ctx.SetCenter(center)
	ctx.SetZoom(zoom)

	if disableAttribution {
		ctx.OverrideAttribution("")
	}

	if marker != nil {
		for _, m := range marker {
			ctx.AddMarker(staticMap.NewMarker(m.pos, m.color, float64(m.size)))
		}
	}

	img, err := ctx.Render()
	if err != nil {
		return nil, err
	}

	pngCtx := gg.NewContextForImage(img)
	pngBuf := new(bytes.Buffer)
	return pngBuf, pngCtx.EncodePNG(pngBuf)
}