#!/usr/bin/env python3
"""Button Widget Demo - Clickable buttons with hover/press states

Interactive controls:
    Click: Interact with buttons
    1-4: Trigger button actions via keyboard
    D: Toggle button 4 enabled/disabled
    ESC: Exit demo
"""
import mcrfpy
import sys

# Add parent to path for imports
sys.path.insert(0, str(__file__).rsplit('/', 2)[0])
from lib.button import Button, create_button_row, create_button_column


class ButtonDemo:
    def __init__(self):
        self.scene = mcrfpy.Scene("button_demo")
        self.ui = self.scene.children
        self.click_count = 0
        self.buttons = []
        self.setup()

    def setup(self):
        """Build the demo scene."""
        # Background
        bg = mcrfpy.Frame(
            pos=(0, 0),
            size=(1024, 768),
            fill_color=mcrfpy.Color(20, 20, 25)
        )
        self.ui.append(bg)

        # Title
        title = mcrfpy.Caption(
            text="Button Widget Demo",
            pos=(512, 30),
            font_size=28,
            fill_color=mcrfpy.Color(255, 255, 255)
        )
        title.outline = 2
        title.outline_color = mcrfpy.Color(0, 0, 0)
        self.ui.append(title)

        # Click counter display
        self.counter_caption = mcrfpy.Caption(
            text="Clicks: 0",
            pos=(512, 70),
            font_size=18,
            fill_color=mcrfpy.Color(200, 200, 100)
        )
        self.ui.append(self.counter_caption)

        # Section 1: Basic buttons with different styles
        section1_label = mcrfpy.Caption(
            text="Basic Buttons (click or press 1-4)",
            pos=(100, 130),
            font_size=16,
            fill_color=mcrfpy.Color(150, 150, 150)
        )
        self.ui.append(section1_label)

        # Default button
        btn1 = Button(
            "Default",
            pos=(100, 160),
            callback=lambda: self.on_button_click("Default")
        )
        self.buttons.append(btn1)
        self.ui.append(btn1.frame)

        # Custom color button
        btn2 = Button(
            "Custom",
            pos=(240, 160),
            fill_color=mcrfpy.Color(80, 50, 100),
            hover_color=mcrfpy.Color(100, 70, 130),
            press_color=mcrfpy.Color(120, 90, 150),
            callback=lambda: self.on_button_click("Custom")
        )
        self.buttons.append(btn2)
        self.ui.append(btn2.frame)

        # Success-style button
        btn3 = Button(
            "Success",
            pos=(380, 160),
            fill_color=mcrfpy.Color(40, 120, 60),
            hover_color=mcrfpy.Color(50, 150, 75),
            press_color=mcrfpy.Color(60, 180, 90),
            outline_color=mcrfpy.Color(100, 200, 120),
            callback=lambda: self.on_button_click("Success")
        )
        self.buttons.append(btn3)
        self.ui.append(btn3.frame)

        # Danger-style button (toggleable)
        self.btn4 = Button(
            "Danger",
            pos=(520, 160),
            fill_color=mcrfpy.Color(150, 50, 50),
            hover_color=mcrfpy.Color(180, 70, 70),
            press_color=mcrfpy.Color(200, 90, 90),
            outline_color=mcrfpy.Color(200, 100, 100),
            callback=lambda: self.on_button_click("Danger")
        )
        self.buttons.append(self.btn4)
        self.ui.append(self.btn4.frame)

        # Section 2: Different sizes
        section2_label = mcrfpy.Caption(
            text="Button Sizes",
            pos=(100, 240),
            font_size=16,
            fill_color=mcrfpy.Color(150, 150, 150)
        )
        self.ui.append(section2_label)

        # Small button
        small = Button(
            "Small",
            pos=(100, 270),
            size=(80, 30),
            font_size=12,
            callback=lambda: self.on_button_click("Small")
        )
        self.ui.append(small.frame)

        # Medium button (default size)
        medium = Button(
            "Medium",
            pos=(200, 270),
            callback=lambda: self.on_button_click("Medium")
        )
        self.ui.append(medium.frame)

        # Large button
        large = Button(
            "Large Button",
            pos=(340, 270),
            size=(180, 50),
            font_size=20,
            callback=lambda: self.on_button_click("Large")
        )
        self.ui.append(large.frame)

        # Section 3: Button row
        section3_label = mcrfpy.Caption(
            text="Button Row (auto-layout)",
            pos=(100, 360),
            font_size=16,
            fill_color=mcrfpy.Color(150, 150, 150)
        )
        self.ui.append(section3_label)

        row_buttons = create_button_row(
            labels=["File", "Edit", "View", "Help"],
            start_pos=(100, 390),
            spacing=5,
            size=(80, 35),
            callbacks=[
                lambda: self.on_button_click("File"),
                lambda: self.on_button_click("Edit"),
                lambda: self.on_button_click("View"),
                lambda: self.on_button_click("Help"),
            ]
        )
        for btn in row_buttons:
            self.ui.append(btn.frame)

        # Section 4: Button column
        section4_label = mcrfpy.Caption(
            text="Button Column",
            pos=(600, 240),
            font_size=16,
            fill_color=mcrfpy.Color(150, 150, 150)
        )
        self.ui.append(section4_label)

        col_buttons = create_button_column(
            labels=["New Game", "Load Game", "Options", "Quit"],
            start_pos=(600, 270),
            spacing=5,
            size=(150, 35),
            callbacks=[
                lambda: self.on_button_click("New Game"),
                lambda: self.on_button_click("Load Game"),
                lambda: self.on_button_click("Options"),
                lambda: self.on_button_click("Quit"),
            ]
        )
        for btn in col_buttons:
            self.ui.append(btn.frame)

        # Section 5: Disabled state
        section5_label = mcrfpy.Caption(
            text="Disabled State (press D to toggle)",
            pos=(100, 470),
            font_size=16,
            fill_color=mcrfpy.Color(150, 150, 150)
        )
        self.ui.append(section5_label)

        self.disabled_btn = Button(
            "Disabled",
            pos=(100, 500),
            enabled=False,
            callback=lambda: self.on_button_click("This shouldn't fire!")
        )
        self.ui.append(self.disabled_btn.frame)

        self.toggle_info = mcrfpy.Caption(
            text="Currently: Disabled",
            pos=(240, 510),
            font_size=14,
            fill_color=mcrfpy.Color(180, 100, 100)
        )
        self.ui.append(self.toggle_info)

        # Instructions
        instr = mcrfpy.Caption(
            text="Click buttons or press 1-4 | D: Toggle disabled | ESC: Exit",
            pos=(50, 730),
            font_size=14,
            fill_color=mcrfpy.Color(120, 120, 120)
        )
        self.ui.append(instr)

        # Last action display
        self.action_caption = mcrfpy.Caption(
            text="Last action: None",
            pos=(50, 600),
            font_size=16,
            fill_color=mcrfpy.Color(100, 200, 100)
        )
        self.ui.append(self.action_caption)

    def on_button_click(self, button_name):
        """Handle button click."""
        self.click_count += 1
        self.counter_caption.text = f"Clicks: {self.click_count}"
        self.action_caption.text = f"Last action: Clicked '{button_name}'"

    def on_key(self, key, state):
        """Handle keyboard input."""
        if state != mcrfpy.InputState.PRESSED:
            return

        if key == mcrfpy.Key.ESCAPE:
            sys.exit(0)
        elif key == mcrfpy.Key.NUM_1 and len(self.buttons) > 0:
            self.buttons[0].callback()
        elif key == mcrfpy.Key.NUM_2 and len(self.buttons) > 1:
            self.buttons[1].callback()
        elif key == mcrfpy.Key.NUM_3 and len(self.buttons) > 2:
            self.buttons[2].callback()
        elif key == mcrfpy.Key.NUM_4 and len(self.buttons) > 3:
            self.buttons[3].callback()
        elif key == mcrfpy.Key.D:
            # Toggle disabled button
            self.disabled_btn.enabled = not self.disabled_btn.enabled
            if self.disabled_btn.enabled:
                self.toggle_info.text = "Currently: Enabled"
                self.toggle_info.fill_color = mcrfpy.Color(100, 180, 100)
            else:
                self.toggle_info.text = "Currently: Disabled"
                self.toggle_info.fill_color = mcrfpy.Color(180, 100, 100)

    def activate(self):
        """Activate the demo scene."""
        self.scene.on_key = self.on_key
        mcrfpy.current_scene = self.scene


def main():
    """Run the button demo."""
    demo = ButtonDemo()
    demo.activate()

    # Headless mode: capture screenshot and exit
    try:
        if mcrfpy.headless_mode():
            from mcrfpy import automation
            mcrfpy.Timer("screenshot", lambda rt: (
                automation.screenshot("screenshots/primitives/button_demo.png"),
                sys.exit(0)
            ), 100)
    except AttributeError:
        # headless_mode() may not exist in all versions
        pass


if __name__ == "__main__":
    main()
