# coding: utf-8
from synergine2_xyz.map import TMXMap
from PIL import Image

from opencombat.simulation.interior import InteriorManager


def test_interior_zones__one_zone():
    map_ = TMXMap('tests/fixtures/one_interior.tmx')
    image = Image.open('tests/fixtures/complex_40x40.png')
    manager = InteriorManager(map_, original_image=image)
    interiors = manager.get_interiors()

    assert interiors
    assert isinstance(interiors, list)
    assert 1 == len(interiors)

    assert (1, 1) in interiors[0]
    assert (1, 2) in interiors[0]
    assert (1, 3) in interiors[0]
    assert (2, 1) in interiors[0]
    assert (2, 2) in interiors[0]
    assert (2, 3) in interiors[0]
    assert (3, 1) in interiors[0]
    assert (3, 2) in interiors[0]
    assert (3, 3) in interiors[0]
    assert 9 == len(interiors[0])


def test_interior_zones__two_separated_zones():
    map_ = TMXMap('tests/fixtures/two_interiors.tmx')
    image = Image.open('tests/fixtures/complex_40x40.png')
    manager = InteriorManager(map_, original_image=image)
    interiors = sorted(manager.get_interiors())

    assert interiors
    assert isinstance(interiors, list)
    assert 2 == len(interiors)

    assert (0, 1) in interiors[0]
    assert (1, 1) in interiors[0]
    assert (0, 2) in interiors[0]
    assert (1, 2) in interiors[0]
    assert (0, 3) in interiors[0]
    assert (1, 3) in interiors[0]
    assert 6 == len(interiors[0])

    assert (3, 1) in interiors[1]
    assert (4, 1) in interiors[1]
    assert (3, 2) in interiors[1]
    assert (4, 2) in interiors[1]
    assert (3, 3) in interiors[1]
    assert (4, 3) in interiors[1]
    assert 6 == len(interiors[1])


def test_interiors_zones__side_by_side_zones_with_separator():
    map_ = TMXMap('tests/fixtures/side_by_side_interiors.tmx')
    image = Image.open('tests/fixtures/complex_40x40.png')
    manager = InteriorManager(map_, original_image=image)
    interiors = sorted(manager.get_interiors())

    assert interiors
    assert isinstance(interiors, list)
    assert 2 == len(interiors)

    assert (0, 1) in interiors[0]
    assert (1, 1) in interiors[0]
    assert (0, 2) in interiors[0]
    assert (1, 2) in interiors[0]
    assert (0, 3) in interiors[0]
    assert (1, 3) in interiors[0]
    assert (2, 1) in interiors[0]
    assert (2, 2) in interiors[0]
    assert (2, 3) in interiors[0]
    assert 9 == len(interiors[0])

    assert (2, 1) in interiors[1]
    assert (2, 2) in interiors[1]
    assert (2, 3) in interiors[1]
    assert (3, 1) in interiors[1]
    assert (4, 1) in interiors[1]
    assert (3, 2) in interiors[1]
    assert (4, 2) in interiors[1]
    assert (3, 3) in interiors[1]
    assert (4, 3) in interiors[1]
    assert 9 == len(interiors[1])


def test_interiors_zones__active_zones():
    # active zones are zone where someone is in
    map_ = TMXMap('tests/fixtures/two_interiors.tmx')
    image = Image.open('tests/fixtures/complex_40x40.png')
    manager = InteriorManager(map_, original_image=image)

    interiors = manager.get_interiors(where_positions=[(0, 1)])

    assert (0, 1) in interiors[0]
    assert (1, 1) in interiors[0]
    assert (0, 2) in interiors[0]
    assert (1, 2) in interiors[0]
    assert (0, 3) in interiors[0]
    assert (1, 3) in interiors[0]
    assert 6 == len(interiors[0])

    interiors = manager.get_interiors(where_positions=[(4, 2)])

    assert 1 == len(interiors)
    assert (3, 1) in interiors[0]
    assert (4, 1) in interiors[0]
    assert (3, 2) in interiors[0]
    assert (4, 2) in interiors[0]
    assert (3, 3) in interiors[0]
    assert (4, 3) in interiors[0]
    assert 6 == len(interiors[0])

    interiors = manager.get_interiors(where_positions=[(0, 1), (4, 2)])

    assert 2 == len(interiors)
    interiors = sorted(interiors)

    assert (0, 1) in interiors[0]
    assert (1, 1) in interiors[0]
    assert (0, 2) in interiors[0]
    assert (1, 2) in interiors[0]
    assert (0, 3) in interiors[0]
    assert (1, 3) in interiors[0]
    assert 6 == len(interiors[0])

    assert (3, 1) in interiors[1]
    assert (4, 1) in interiors[1]
    assert (3, 2) in interiors[1]
    assert (4, 2) in interiors[1]
    assert (3, 3) in interiors[1]
    assert (4, 3) in interiors[1]
    assert 6 == len(interiors[1])


def test_interiors_zones__make_image_transparent__just_replace():
    map_ = TMXMap('tests/fixtures/one_interior.tmx')
    image = Image.open('tests/fixtures/white_40x40.png')
    manager = InteriorManager(map_, original_image=image)
    interiors = manager.get_interiors()
    after_image_bytes = Image.open('tests/fixtures/white_one_interior_40x40.png').tobytes()

    image = manager.update_image_for_interiors(interiors, 8, 8)
    assert after_image_bytes == image.tobytes()


def test_interiors_zones__make_image_complex_transparent__just_replace():
    map_ = TMXMap('tests/fixtures/one_interior.tmx')
    image = Image.open('tests/fixtures/complex_40x40.png')
    manager = InteriorManager(map_, original_image=image)
    interiors = manager.get_interiors()
    after_image_bytes = Image.open('tests/fixtures/complex_one_interior_40x40.png').tobytes()

    image = manager.update_image_for_interiors(interiors, 8, 8)
    assert after_image_bytes == image.tobytes()


def test_interiors_zones__make_image_corner_transparent__just_replace():
    map_ = TMXMap('tests/fixtures/corner_interior.tmx')
    image = Image.open('tests/fixtures/white_40x40.png')
    manager = InteriorManager(map_, original_image=image)
    interiors = manager.get_interiors()
    after_image_bytes = Image.open('tests/fixtures/white_corner_interior_40x40.png').tobytes()

    image = manager.update_image_for_interiors(interiors, 8, 8)
    assert after_image_bytes == image.tobytes()