"""mapgen 合成器单测:Wang index、跨级压平、地形渲染、物件遮挡序。"""

from PIL import Image

from genesis.mapgen.compose import (
    Placement,
    WangTileSheet,
    paste_objects,
    render_terrain,
    smooth_levels,
    wang_index,
)


def test_wang_index_corners():
    assert wang_index(1, 1, 1, 1, hi=1) == 15
    assert wang_index(0, 0, 0, 0, hi=1) == 0
    assert wang_index(1, 0, 0, 0, hi=1) == 8
    assert wang_index(0, 1, 0, 1, hi=1) == 5
    # hi 取更高等级:2 级角点相对 1 级为 upper
    assert wang_index(2, 1, 1, 2, hi=2) == 9


def test_smooth_levels_clamps_cross_level_neighbors():
    levels = [
        [0, 0, 0],
        [0, 3, 0],
        [0, 0, 0],
    ]
    smooth_levels(levels)
    assert levels[1][1] == 1  # 周围全 0,中心最多 1
    for row in levels:
        assert all(v in (0, 1) for v in row)


def _dummy_sheet(px: int = 4) -> WangTileSheet:
    tiles = {i: Image.new("RGBA", (px, px), (i * 16, 0, 0, 255)) for i in range(16)}
    return WangTileSheet(tiles, px, lower="lo", upper="hi")


def test_render_terrain_size_and_mixed_cells():
    sheets = [_dummy_sheet(), _dummy_sheet()]
    levels = [
        [0, 0, 0, 0],
        [0, 1, 1, 0],
        [0, 1, 2, 1],
        [0, 0, 1, 0],
    ]
    smooth_levels(levels)
    img = render_terrain(levels, sheets)
    assert img.size == (12, 12)  # (4-1)*4px


def test_paste_objects_lower_y_drawn_first():
    canvas = Image.new("RGBA", (10, 10), (0, 0, 0, 255))
    red = Image.new("RGBA", (4, 4), (255, 0, 0, 255))
    blue = Image.new("RGBA", (4, 4), (0, 0, 255, 255))
    # blue 脚底更低(y=9),应后画、盖住 red
    paste_objects(canvas, [Placement(blue, 5, 9), Placement(red, 5, 7)])
    assert canvas.getpixel((5, 6)) == (0, 0, 255, 255)
