from PyQt5.QtCore import Qt, QTimer, QSize
from PyQt5.QtMultimedia import (
    QCamera,
    QCameraInfo,
    QCameraViewfinderSettings,
    QVideoFrame,
)
from PyQt5.QtMultimediaWidgets import QCameraViewfinder
from PyQt5.QtWidgets import QFrame, QLabel, QSizePolicy, QVBoxLayout


class KinectCameraTile(QFrame):
    """Live Kinect preview only. Frames are never recorded or retained."""

    def __init__(self, parent=None):
        super().__init__(parent)
        self.camera = None

        self.setMinimumWidth(210)
        self.setMaximumWidth(280)
        self.setMinimumHeight(160)
        self.setMaximumHeight(176)
        self.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Fixed)
        self.setStyleSheet(
            "QFrame {background:#03070d; border:2px solid #8f35ff;"
            "border-radius:7px;}"
        )

        layout = QVBoxLayout(self)
        layout.setContentsMargins(3, 2, 3, 3)
        layout.setSpacing(2)

        title = QLabel("KINECT VISION")
        title.setAlignment(Qt.AlignCenter)
        title.setStyleSheet(
            "color:#00ff88; border:none; font-size:10px; font-weight:bold;"
        )

        self.viewfinder = QCameraViewfinder()
        self.viewfinder.setMinimumHeight(125)
        self.viewfinder.setStyleSheet("background:#000; border:1px solid #00ff88;")

        self.status = QLabel("STANDBY")
        self.status.setAlignment(Qt.AlignCenter)
        self.status.setStyleSheet(
            "color:#ffaa33; border:none; font-size:9px; font-weight:bold;"
        )

        layout.addWidget(title)
        layout.addWidget(self.viewfinder, 1)
        layout.addWidget(self.status)

    def start_camera(self):
        if self.camera and self.camera.state() == QCamera.ActiveState:
            return

        camera_info = next(
            (
                item for item in QCameraInfo.availableCameras()
                if "Xbox NUI" in item.description()
            ),
            None,
        )

        if camera_info is None:
            self.status.setText("KINECT OFFLINE")
            return

        if self.camera is None:
            self.camera = QCamera(camera_info, self)
            self.camera.setCaptureMode(QCamera.CaptureVideo)

            settings = QCameraViewfinderSettings()
            settings.setResolution(QSize(640, 480))
            settings.setMinimumFrameRate(15.0)
            settings.setMaximumFrameRate(15.0)
            settings.setPixelFormat(QVideoFrame.Format_RGB32)

            self.camera.setViewfinderSettings(settings)
            self.camera.setViewfinder(self.viewfinder)
            self.camera.stateChanged.connect(self._state_changed)
            self.camera.error.connect(self._camera_error)

        self.status.setText("STARTING")
        self.camera.start()

    def stop_camera(self):
        if self.camera:
            self.camera.stop()
        self.status.setText("STANDBY")

    def _state_changed(self, state):
        if state == QCamera.ActiveState:
            self.status.setText("LIVE • NO RECORDING")
        elif state == QCamera.UnloadedState:
            self.status.setText("STANDBY")

    def _camera_error(self, _error):
        message = self.camera.errorString() if self.camera else "Camera error"
        self.status.setText(f"ERROR: {message[:28]}")

    def showEvent(self, event):
        super().showEvent(event)
        QTimer.singleShot(100, self.start_camera)

    def hideEvent(self, event):
        self.stop_camera()
        super().hideEvent(event)
