from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
from PyQt5.QtGui import *
from framework.warden_theme import *
from framework.warden_widgets import *
from core.agent_manager import agent_manager


class AgentRow(WardenPanel):
    def __init__(self, key, data):
        super().__init__(state_colour(data.get("state", "standby")))
        self.key = key
        self.setMinimumHeight(44)

        layout = QGridLayout()
        layout.setContentsMargins(6, 3, 6, 3)
        layout.setSpacing(2)

        self.name = QLabel()
        self.role = QLabel()
        self.task = QLabel()
        self.state = QLabel()
        self.progress = QLabel()

        self.name.setStyleSheet(f"color:{GREEN}; font-size:11px; font-weight:bold; border:none; background:transparent;")
        self.role.setStyleSheet(f"color:{WHITE}; font-size:8px; font-weight:bold; border:none; background:transparent;")
        self.task.setStyleSheet(f"color:{MUTED}; font-size:8px; font-weight:bold; border:none; background:transparent;")
        self.state.setAlignment(Qt.AlignRight | Qt.AlignVCenter)
        self.progress.setAlignment(Qt.AlignRight | Qt.AlignVCenter)

        layout.addWidget(self.name, 0, 0)
        layout.addWidget(self.role, 0, 1)
        layout.addWidget(self.state, 0, 2)
        layout.addWidget(self.task, 1, 0, 1, 2)
        layout.addWidget(self.progress, 1, 2)

        self.setLayout(layout)
        self.refresh()

    def refresh(self):
        data = agent_manager.agents[self.key]
        state = data.get("state", "standby")
        colour = state_colour(state)

        self.setStyleSheet(f"""
            QFrame {{
                background-color: {PANEL_BG};
                border: 2px solid {colour};
                border-radius: 8px;
            }}
        """)

        self.name.setText(data["name"])
        self.role.setText(data["role"])
        self.task.setText(data.get("task", "---"))
        self.state.setText(state.upper())
        self.progress.setText(f'{data.get("progress", 0)}%')

        self.state.setStyleSheet(f"color:{colour}; font-size:9px; font-weight:bold; border:none; background:transparent;")
        self.progress.setStyleSheet(f"color:{colour}; font-size:9px; font-weight:bold; border:none; background:transparent;")


class AgentsPage(WardenBackground):
    def __init__(self, stack):
        super().__init__()
        self.stack = stack
        self.rows = {}

        main = QVBoxLayout()
        main.setContentsMargins(8, 3, 8, 3)
        main.setSpacing(3)

        title = QLabel("♟ AGENT MANAGER")
        title.setAlignment(Qt.AlignCenter)
        title.setStyleSheet(f"color:{GREEN}; font-size:18px; font-weight:bold; background:transparent;")
        main.addWidget(title)

        subtitle = QLabel("SHIRE WORKER COUNCIL")
        subtitle.setAlignment(Qt.AlignCenter)
        subtitle.setStyleSheet(f"color:{WHITE}; font-size:8px; font-weight:bold; background:transparent;")
        main.addWidget(subtitle)

        for key, data in agent_manager.agents.items():
            row = AgentRow(key, data)
            self.rows[key] = row
            main.addWidget(row)

        controls = QGridLayout()
        controls.setSpacing(3)

        btn_demo = WardenTouchButton("⚒", "NIGHT", "FORGE", "online")
        btn_demo.clicked.connect(self.night_forge_demo)

        btn_online = WardenTouchButton("⚡", "START", "ALL", "online")
        btn_online.clicked.connect(self.start_all)

        btn_standby = WardenTouchButton("◌", "STANDBY", "ALL", "standby")
        btn_standby.clicked.connect(self.standby_all)

        btn_back = WardenTouchButton("↩", "RETURN", "HOME", "online")
        btn_back.clicked.connect(lambda: self.stack.setCurrentIndex(0))

        controls.addWidget(btn_demo, 0, 0)
        controls.addWidget(btn_online, 0, 1)
        controls.addWidget(btn_standby, 0, 2)
        controls.addWidget(btn_back, 0, 3)

        main.addLayout(controls)
        self.setLayout(main)

        self.timer = QTimer()
        self.timer.timeout.connect(self.refresh)
        self.timer.start(1000)
        self.refresh()

    def paintEvent(self, event):
        painter = QPainter(self)
        painter.setRenderHint(QPainter.Antialiasing)
        self.paint_warden_background(painter)
        super().paintEvent(event)

    def night_forge_demo(self):
        agent_manager.start_night_forge_demo()
        self.refresh()

    def start_all(self):
        for key in list(agent_manager.agents.keys()):
            agent_manager.activate_agent(key)
        self.refresh()

    def standby_all(self):
        agent_manager.standby_all()
        self.refresh()

    def refresh(self):
        for row in self.rows.values():
            row.refresh()
