package coords

import (
	"math"
)

type TileCoords struct {
	X       int `json:"x"`
	Y       int `json:"y"`
	Zoom    int `json:"zoom"`
	LayerId int `json:"layerid"`
}

type TileQuadrants struct {
	UpperLeft, UpperRight, LowerLeft, LowerRight *TileCoords
}

func NewTileCoords(x, y, zoom int, layerId int) *TileCoords {
	return &TileCoords{X: x, Y: y, Zoom: zoom, LayerId: layerId}
}

func (tc *TileCoords) ZoomOut(n int) *TileCoords {
	var nc *TileCoords = tc
	for i := 0; i < n; i++ {
		nc = nc.GetZoomedOutTile()
	}

	return nc
}

func (tc *TileCoords) GetZoomedOutTile() *TileCoords {
	return &TileCoords{
		X:       int(math.Floor(float64(tc.X) / 2.0)),
		Y:       int(math.Floor(float64(tc.Y) / 2.0)),
		Zoom:    tc.Zoom - 1,
		LayerId: tc.LayerId}
}

func (tc *TileCoords) GetZoomedQuadrantsFromTile() TileQuadrants {
	nextZoom := tc.Zoom + 1

	nextZoomX := tc.X * 2
	nextZoomY := tc.Y * 2

	upperLeft := &TileCoords{X: nextZoomX, Y: nextZoomY, Zoom: nextZoom, LayerId: tc.LayerId}
	upperRight := &TileCoords{X: nextZoomX + 1, Y: nextZoomY, Zoom: nextZoom, LayerId: tc.LayerId}
	lowerLeft := &TileCoords{X: nextZoomX, Y: nextZoomY + 1, Zoom: nextZoom, LayerId: tc.LayerId}
	lowerRight := &TileCoords{X: nextZoomX + 1, Y: nextZoomY + 1, Zoom: nextZoom, LayerId: tc.LayerId}

	return TileQuadrants{
		UpperLeft:  upperLeft,
		UpperRight: upperRight,
		LowerLeft:  lowerLeft,
		LowerRight: lowerRight,
	}
}