from textual.app import App, ComposeResult
from textual.widgets import DataTable

from rich.syntax import Syntax
from rich.table import Table

CODE = '''\
def loop_first_last(values: Iterable[T]) -> Iterable[tuple[bool, bool, T]]:
    """Iterate and generate a tuple with a flag for first and last value."""
    iter_values = iter(values)
    try:
        previous_value = next(iter_values)
    except StopIteration:
        return
    first = True
    for value in iter_values:
        yield first, False, previous_value
        first = False
        previous_value = value
    yield first, True, previous_value'''

test_table = Table(title="Star Wars Movies")

test_table.add_column("Released", style="cyan", no_wrap=True)
test_table.add_column("Title", style="magenta")
test_table.add_column("Box Office", justify="right", style="green")

test_table.add_row("Dec 20, 2019", "Star Wars: The Rise of Skywalker", "$952,110,690")
test_table.add_row("May 25, 2018", "Solo: A Star Wars Story", "$393,151,347")
test_table.add_row(
    "Dec 15, 2017", "Star Wars Ep. V111: The Last Jedi", "$1,332,539,889"
)
test_table.add_row("Dec 16, 2016", "Rogue One: A Star Wars Story", "$1,332,439,889")


class TableApp(App):
    def compose(self) -> ComposeResult:
        table = self.table = DataTable(id="data")
        yield table

        table.add_column("Foo", width=20)
        table.add_column("Bar", width=60)
        table.add_column("Baz", width=20)
        table.add_column("Foo", width=16)
        table.add_column("Bar", width=16)
        table.add_column("Baz", width=16)

        for n in range(200):
            height = 1
            row = [f"row [b]{n}[/b] col [i]{c}[/i]" for c in range(6)]
            if n == 10:
                row[1] = Syntax(
                    CODE,
                    "python",
                    theme="ansi_dark",
                    line_numbers=True,
                    indent_guides=True,
                )
                height = 13

            if n == 30:
                row[1] = test_table
                height = 13
            table.add_row(*row, height=height)

        table.focus()

    def on_mount(self):
        self.bind("d", "toggle_dark")
        self.bind("z", "toggle_zebra")
        self.bind("x", "exit")

    def action_toggle_dark(self) -> None:
        self.app.dark = not self.app.dark

    def action_toggle_zebra(self) -> None:
        self.table.zebra_stripes = not self.table.zebra_stripes

    def action_exit(self) -> None:
        pass


app = TableApp()
if __name__ == "__main__":
    print(app.run())
