"""
capture
Picamera2 を使用してカメラ画像を取得するモジュール
"""

import cv2
import numpy as np
from picamera2 import Picamera2

from common import config


class CameraCapture:
    """Picamera2 でフレームを取得するクラス"""

    def __init__(self) -> None:
        self._camera: Picamera2 | None = None

    def start(self) -> None:
        """カメラを初期化して撮影を開始する"""
        self._camera = Picamera2()
        camera_config = self._camera.create_preview_configuration(
            main={
                "size": (
                    config.CAPTURE_WIDTH,
                    config.CAPTURE_HEIGHT,
                ),
                "format": "YUV420",
            },
        )
        self._camera.configure(camera_config)
        self._camera.start()

    def capture(self) -> np.ndarray:
        """1フレームを取得する

        撮影後に INTER_AREA で縮小して返す

        Returns:
            グレースケールの画像（NumPy 配列）
        """
        yuv = self._camera.capture_array()
        gray = yuv[
            :config.CAPTURE_HEIGHT,
            :config.CAPTURE_WIDTH,
        ]
        return cv2.resize(
            gray,
            (config.FRAME_WIDTH, config.FRAME_HEIGHT),
            interpolation=cv2.INTER_AREA,
        )

    def stop(self) -> None:
        """カメラを停止する"""
        if self._camera is not None:
            self._camera.stop()
            self._camera.close()
            self._camera = None
