from io import StringIO
from textwrap import dedent

import pytest

from tilemapper import battlemap, tileset
from tilemapper.grid import X_COORDS


@pytest.fixture
def manager():
    return tileset.TileSetManager()


@pytest.fixture
def sample_map():
    return dedent(
        """
        ........ 1
        ........   ........ 2
        ........   ........
        .......L...D...  D
        ........   .... ...
        ........   ...d ...
                      .
            .........S. 3
        5   .         .
        ....S...   ...d.... 4
        ........   ........
        ........   ........

    """
    )


def test_tileset_loader(manager):
    assert "colorized" in manager.available
    assert "ascii" in manager.available


def test_renderer(manager, sample_map):
    test_map = battlemap.BattleMap("test map", source=StringIO(sample_map), tileset=manager.load("ascii"))
    test_map.load()
    assert test_map.width == 21
    assert test_map.height == 12
    assert test_map.source_data == sample_map.strip("\n")

    srclines = sample_map.splitlines()[1:]
    strlines = str(test_map).splitlines()
    for i in range(len(strlines)):
        assert strlines[i] == srclines[i].ljust(21, " ")


def test_grid_coordiates(manager):
    coord_length = len(X_COORDS)
    map_size = 2 * coord_length + 1
    bigmap = StringIO((("." * map_size) + "\n") * map_size)
    test_map = battlemap.BattleMap("test map", source=bigmap, tileset=manager.load("ascii"))
    test_map.load()
    assert test_map.grid.data[-1][-1].coordinates == (f"{map_size - 1}", X_COORDS[0] * 3)

    lines = test_map.top_coordinates.splitlines()
    assert len(lines) == 3
    assert lines[0] == (" " * (map_size - 1)) + X_COORDS[0]
    assert lines[1][: (coord_length + 1)] == (" " * coord_length) + X_COORDS[0]
    assert lines[2] == "".join(X_COORDS) + ((coord_length + 1) * X_COORDS[0])
