package model

import (
	"github.com/df-mc/dragonfly/server/block/cube"
	"github.com/df-mc/dragonfly/server/world"
)

// Slab is the model of a slab-like block, which is either a half block or a full block, depending on if the
// slab is double.
type Slab struct {
	// Double and Top specify if the Slab is a double slab and if it's in the top slot respectively. If Double is true,
	// the BBox returned is always a full block.
	Double, Top bool
}

// BBox returns either a physics.BBox spanning a full block or a half block in the top/bottom part of the block,
// depending on the Double and Top fields.
func (s Slab) BBox(cube.Pos, world.BlockSource) []cube.BBox {
	if s.Double {
		return []cube.BBox{full}
	}
	if s.Top {
		return []cube.BBox{cube.Box(0, 0.5, 0, 1, 1, 1)}
	}
	return []cube.BBox{cube.Box(0, 0, 0, 1, 0.5, 1)}
}

// FaceSolid returns true if the Slab is double, or if the face is cube.FaceUp when the Top field is true, or if the
// face is cube.FaceDown when the Top field is false.
func (s Slab) FaceSolid(_ cube.Pos, face cube.Face, _ world.BlockSource) bool {
	if s.Double {
		return true
	} else if s.Top {
		return face == cube.FaceUp
	}
	return face == cube.FaceDown
}
