"""PNG 画像の読み込みと ROI 抽出モジュール."""

from pathlib import Path

import cv2
import numpy


def load_image(path: str) -> numpy.ndarray:
    """PNG 画像を読み込み RGB 配列として返す．

    OpenCV は BGR で読み込むため RGB に変換する．

    Args:
        path: 画像ファイルのパス．

    Returns:
        RGB 画像の NumPy 配列（H x W x 3, uint8）．

    Raises:
        FileNotFoundError: 指定されたパスに画像ファイルが存在しない場合．
        ValueError: OpenCV が画像を読み込めなかった場合（形式が不正等）．
    """
    if not Path(path).exists():
        raise FileNotFoundError(f"画像ファイルが見つかりません: {path}")

    bgr = cv2.imread(str(path))
    if bgr is None:
        raise ValueError(
            f"画像の読み込みに失敗しました（形式が不正の可能性があります）: {path}"
        )

    # BGR → RGB 変換
    rgb = cv2.cvtColor(bgr, cv2.COLOR_BGR2RGB)
    return rgb


def extract_roi(
    image: numpy.ndarray,
    x: int,
    y: int,
    width: int,
    height: int,
) -> numpy.ndarray:
    """画像から矩形 ROI（関心領域）を切り出す．

    Args:
        image: 入力画像の NumPy 配列（H x W x 3）．
        x: ROI 左上隅の X 座標（列方向，ピクセル）．
        y: ROI 左上隅の Y 座標（行方向，ピクセル）．
        width: ROI の幅（ピクセル）．
        height: ROI の高さ（ピクセル）．

    Returns:
        切り出した ROI の NumPy 配列（height x width x 3, uint8）．

    Raises:
        ValueError: ROI が画像の範囲外に出る場合．
    """
    img_h, img_w = image.shape[:2]

    if x < 0 or y < 0 or width <= 0 or height <= 0:
        raise ValueError(
            f"ROI のパラメータが不正です: x={x}, y={y}, width={width}, height={height}"
        )

    if x + width > img_w or y + height > img_h:
        raise ValueError(
            f"ROI が画像範囲外に出ています: "
            f"ROI=({x}, {y}, {width}, {height}), 画像サイズ=({img_w}, {img_h})"
        )

    return image[y : y + height, x : x + width]
