package world

import (
	"testing"
)

// TestSurfaceVariesByBiome is the load-bearing correctness check for surface
// rules: it generates real chunks and confirms the top surface block differs
// across biomes. Before surface rules every chunk resolved to grass (9); after,
// deserts/oceans/badlands carry sand/gravel/terracotta-family blocks.
func TestSurfaceVariesByBiome(t *testing.T) {
	gen := NewVanillaGenerator(12345)
	seen := make(map[uint16]int) // surfaceBlockID → chunk count
	// Scan a moderate area to find dry land (surface above sea level), where
	// surface rules actually place biome-specific blocks. Ocean columns sit
	// below sea level and stay stone, which is correct.
	for cx := 0; cx < 16; cx++ {
		for cz := 0; cz < 16; cz++ {
			ch := gen(int32(cx)-8, int32(cz)-8)
			if ch == nil {
				continue
			}
			blk, dry := centreSurfaceBlock(ch)
			if !dry {
				continue // skip ocean/underwater columns
			}
			if blk != 0 {
				seen[blk]++
			}
		}
	}
	if len(seen) < 2 {
		t.Fatalf("expected >=2 distinct dry-land surface blocks, got %d (%v)", len(seen), seen)
	}
	t.Logf("dry-land surface block distribution: %v", seen)
}

// centreSurfaceBlock returns the topmost non-air/non-water block at (8,8) and
// whether that block sits at or above sea level (i.e. it is dry land, where
// surface rules apply rather than being submerged).
func centreSurfaceBlock(ch *Chunk) (uint16, bool) {
	for i := SectionCount - 1; i >= 0; i-- {
		s := ch.sections[i]
		if s == nil {
			continue
		}
		for ly := 15; ly >= 0; ly-- {
			st := s[blockIndex(8, MinY+i*16+ly, 8)]
			if st != StateAir && st != StateWater {
				// Dry only if this top block is at/above sea level.
				return st, (MinY+i*16+ly) >= SeaLevel
			}
		}
	}
	return 0, false
}
