"""
base
操舵量計算の共通インターフェースを定義するモジュール
全ての操舵量計算クラスはこのインターフェースに従う
"""

from abc import ABC, abstractmethod
from dataclasses import dataclass

import numpy as np


@dataclass
class SteeringOutput:
    """操舵量計算の出力を格納するデータクラス

    Attributes:
        throttle: 前後方向の出力 (-1.0 ~ +1.0)
        steer: 左右方向の出力 (-1.0 ~ +1.0)
    """
    throttle: float
    steer: float


class SteeringBase(ABC):
    """操舵量計算の基底クラス

    全ての操舵量計算クラスはこのクラスを継承し，
    compute メソッドを実装する
    """

    @abstractmethod
    def compute(
        self, frame: np.ndarray,
    ) -> SteeringOutput:
        """カメラ画像から操舵量を計算する

        Args:
            frame: BGR 形式のカメラ画像

        Returns:
            計算された操舵量
        """

    @abstractmethod
    def reset(self) -> None:
        """内部状態をリセットする

        自動操縦の開始時に呼び出される
        """
