"""Test method in BaseTable class."""

import pytest

from terminaltables3.base_table import BaseTable
from terminaltables3.width_and_alignment import max_dimensions

SINGLE_LINE = (
    ("Name", "Color", "Type"),
    ("Avocado", "green", "nut"),
    ("Tomato", "red", "fruit"),
    ("Lettuce", "green", "vegetable"),
)


@pytest.mark.parametrize("inner_column_border", [True, False])
@pytest.mark.parametrize("style", ["top", "bottom"])
def test_top_bottom(inner_column_border, style):
    """Test top and bottom borders.

    :param bool inner_column_border: Passed to table class.
    :param str style: Passed to method.
    """
    table = BaseTable(SINGLE_LINE, "Example")
    table.inner_column_border = inner_column_border
    outer_widths = max_dimensions(
        table.table_data, table.padding_left, table.padding_right
    )[2]

    # Determine expected.
    if style == "top" and inner_column_border:
        expected = "+Example--+-------+-----------+"
    elif style == "top":
        expected = "+Example--------------------+"
    elif style == "bottom" and inner_column_border:
        expected = "+---------+-------+-----------+"
    else:
        expected = "+---------------------------+"

    # Test.
    actual = "".join(table.horizontal_border(style, outer_widths))
    assert actual == expected


@pytest.mark.parametrize("inner_column_border", [True, False])
@pytest.mark.parametrize("outer_border", [True, False])
@pytest.mark.parametrize("style", ["heading", "footing"])
def test_heading_footing(inner_column_border, outer_border, style):
    """Test heading and footing borders.

    :param bool inner_column_border: Passed to table class.
    :param bool outer_border: Passed to table class.
    :param str style: Passed to method.
    """
    table = BaseTable(SINGLE_LINE)
    table.inner_column_border = inner_column_border
    table.outer_border = outer_border
    outer_widths = max_dimensions(
        table.table_data, table.padding_left, table.padding_right
    )[2]

    # Determine expected.
    if style == "heading" and outer_border:
        expected = (
            "+---------+-------+-----------+"
            if inner_column_border
            else "+---------------------------+"
        )
    elif style == "heading":
        expected = (
            "---------+-------+-----------"
            if inner_column_border
            else "---------------------------"
        )
    elif style == "footing" and outer_border:
        expected = (
            "+---------+-------+-----------+"
            if inner_column_border
            else "+---------------------------+"
        )
    else:
        expected = (
            "---------+-------+-----------"
            if inner_column_border
            else "---------------------------"
        )

    # Test.
    actual = "".join(table.horizontal_border(style, outer_widths))
    assert actual == expected


@pytest.mark.parametrize("inner_column_border", [True, False])
@pytest.mark.parametrize("outer_border", [True, False])
def test_row(inner_column_border, outer_border):
    """Test inner borders.

    :param bool inner_column_border: Passed to table class.
    :param bool outer_border: Passed to table class.
    """
    table = BaseTable(SINGLE_LINE)
    table.inner_column_border = inner_column_border
    table.outer_border = outer_border
    outer_widths = max_dimensions(
        table.table_data, table.padding_left, table.padding_right
    )[2]

    # Determine expected.
    if inner_column_border and outer_border:
        expected = "+---------+-------+-----------+"
    elif inner_column_border:
        expected = "---------+-------+-----------"
    elif outer_border:
        expected = "+---------------------------+"
    else:
        expected = "---------------------------"

    # Test.
    actual = "".join(table.horizontal_border("row", outer_widths))
    assert actual == expected
