#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
相机管理器模块
提供相机和显示的统一管理和线程安全访问
"""
import threading
import config
from logger_manager import logger_manager


class CameraManager:
    """相机管理器（单例）"""
    _instance = None
    
    def __new__(cls):
        if cls._instance is None:
            cls._instance = super(CameraManager, cls).__new__(cls)
            cls._instance._initialized = False
        return cls._instance
    
    def __init__(self):
        if self._initialized:
            return
        
        # 私有对象
        self._camera = None
        self._display = None
        
        # 线程安全锁
        self._camera_lock = threading.Lock()
        self._display_lock = threading.Lock()
        
        # 相机配置
        self._camera_width = 640
        self._camera_height = 480
        
        self._initialized = True
    
    # ==================== 初始化方法 ====================
    
    @property
    def logger(self):
        """获取 logger 对象"""
        return logger_manager.logger
    
    def init_camera(self, width=640, height=480):
        """初始化相机"""
        if self._camera is not None:
            return self._camera
        
        from maix import camera
        
        self._camera_width = width
        self._camera_height = height
        
        with self._camera_lock:
            if self._camera is None:
                self._camera = camera.Camera(width, height)
        
        return self._camera
    
    def init_display(self):
        """初始化显示"""
        if self._display is not None:
            return self._display
        
        from maix import display
        
        with self._display_lock:
            if self._display is None:
                self._display = display.Display()
        
        return self._display
    
    # ==================== 访问方法 ====================
    
    @property
    def camera(self):
        """获取相机实例（懒加载）"""
        if self._camera is None:
            self.init_camera()
        return self._camera
    
    @property
    def display(self):
        """获取显示实例（懒加载）"""
        if self._display is None:
            self.init_display()
        return self._display
    
    # ==================== 业务方法 ====================
    
    def read_frame(self):
        """
        线程安全地读取一帧图像
        
        Returns:
            frame: 图像帧对象
        """
        with self._camera_lock:
            if self._camera is None:
                self.init_camera()
            return self._camera.read()
    
    def show(self, image):
        """
        线程安全地显示图像
        
        Args:
            image: 要显示的图像对象
        """
        with self._display_lock:
            if self._display is None:
                self.init_display()
            self._display.show(image)
    
    def release(self):
        """释放相机和显示资源（如果需要）"""
        with self._camera_lock:
            if self._camera is not None:
                # MaixPy 的 Camera 可能不需要显式释放，但可以在这里清理
                self._camera = None
        
        with self._display_lock:
            if self._display is not None:
                # MaixPy 的 Display 可能不需要显式释放
                self._display = None


# 创建全局单例实例
camera_manager = CameraManager()





