"""Controls go2rtc restream."""


import logging
import requests

from typing import Optional

from frigate.config import FrigateConfig, RestreamCodecEnum
from frigate.const import BIRDSEYE_PIPE
from frigate.ffmpeg_presets import (
    parse_preset_hardware_acceleration_encode,
    parse_preset_hardware_acceleration_go2rtc_engine,
)
from frigate.util import escape_special_characters

logger = logging.getLogger(__name__)


def get_manual_go2rtc_stream(
    camera_url: str, codec: RestreamCodecEnum, engine: Optional[str]
) -> str:
    """Get a manual stream for go2rtc."""
    if codec == RestreamCodecEnum.copy:
        return f"ffmpeg:{camera_url}#video=copy#audio=aac#audio=opus"

    if engine:
        return (
            f"ffmpeg:{camera_url}#video={codec}#hardware={engine}#audio=aac#audio=opus"
        )

    return f"ffmpeg:{camera_url}#video={codec}#audio=aac#audio=opus"


class RestreamApi:
    """Control go2rtc relay API."""

    def __init__(self, config: FrigateConfig) -> None:
        self.config: FrigateConfig = config

    def add_cameras(self) -> None:
        """Add cameras to go2rtc."""
        self.relays: dict[str, str] = {}

        for cam_name, camera in self.config.cameras.items():
            if not camera.restream.enabled:
                continue

            for input in camera.ffmpeg.inputs:
                if "restream" in input.roles:
                    if (
                        input.path.startswith("rtsp")
                        and not camera.restream.force_audio
                    ):
                        self.relays[cam_name] = escape_special_characters(input.path)
                    else:
                        # go2rtc only supports rtsp for direct relay, otherwise ffmpeg is used
                        self.relays[cam_name] = get_manual_go2rtc_stream(
                            escape_special_characters(input.path),
                            camera.restream.video_encoding,
                            parse_preset_hardware_acceleration_go2rtc_engine(
                                self.config.ffmpeg.hwaccel_args
                            ),
                        )

        if self.config.restream.birdseye:
            self.relays[
                "birdseye"
            ] = f"exec:{parse_preset_hardware_acceleration_encode(self.config.ffmpeg.hwaccel_args, f'-f rawvideo -pix_fmt yuv420p -video_size {self.config.birdseye.width}x{self.config.birdseye.height} -r 10 -i {BIRDSEYE_PIPE}', '-rtsp_transport tcp -f rtsp {output}')}"

        for name, path in self.relays.items():
            params = {"src": path, "name": name}
            requests.put("http://127.0.0.1:1984/api/streams", params=params)