package grid

import (
	"openquell/components"
	. "openquell/config"
)

func (grid *Grid) GetSolidNeighborPosition(
	position *components.Position,
	velocity *components.Velocity,
	solid bool) (bool, *components.Position) {

	if !solid {
		return false, nil
	}

	// set to true  if we are already on the last  tile in the current
	// direction, i.e. on the edge of the grid
	edge := true
	neighborpos := position.Point()

	switch velocity.Direction {
	case East:
		if neighborpos.X < grid.TilesX {
			neighborpos.X++
			edge = false
		}
	case West:
		if neighborpos.X > 0 {
			neighborpos.X--
			edge = false
		}
	case South:
		if neighborpos.Y < grid.TilesY {
			neighborpos.Y++
			edge = false
		}
	case North:
		if neighborpos.Y > 0 {
			neighborpos.Y--
			edge = false
		}
	}

	newpos := components.NewPosition(neighborpos, grid.Tilesize)

	// slog.Debug("SolidNeighbor?", "player", position.Point(),
	// 	"neighbor", neighborpos, "edge", edge, "neighbor-solid",
	// 	grid.Map[neighborpos].Solid, "newpos", newpos.Point())
	if !edge && grid.Map[neighborpos].Solid {
		return true, newpos
	}

	return false, nil
}

func (grid *Grid) BumpEdge(
	pos *components.Position,
	velocity *components.Velocity) (bool, *components.Position) {

	x := pos.X + velocity.Data.X
	y := pos.Y + velocity.Data.Y

	if x < 0 || x > grid.Width-grid.Tilesize || y < 0 || y > grid.Height-grid.Tilesize {
		newpos := &components.Position{}
		X := pos.X
		Y := pos.Y

		switch velocity.Direction {
		case East:
			X = 0
		case West:
			X = grid.Width - grid.Tilesize
		case South:
			Y = 0
		case North:
			Y = grid.Height - grid.Tilesize
		}

		newpos.Update(X, Y, grid.Tilesize)
		return true, newpos
	}

	return false, nil
}
