"""
Abhängigkeiten:
- cv2 (OpenCV-Paket)
- numpy

Autor: Roberto Gelsinger
Datum: 07.12.2023
Version: Modulversion
"""

import cv2
import numpy as np


def build_gaussian_pyramid(img, levels):
    """
    Erstellt eine Gaußsche Pyramide für ein gegebenes Bild.

    Diese Funktion nimmt ein Bild und die gewünschte Anzahl von Ebenen und erstellt eine Gaußsche Pyramide.
    Eine Gaußsche Pyramide ist eine Sammlung von Bildern, die bei jeder Ebene halbiert werden.

    Args:
    img (ndarray): Das Eingabebild.
    levels (int): Die Anzahl der Ebenen in der Pyramide.

    Returns:
    list: Eine Liste von Bildern, die die Ebenen der Gaußschen Pyramide darstellen.
    """
    float_img = np.ndarray(shape=img.shape, dtype="float")
    float_img[:] = img
    pyramid = [float_img]

    for i in range(levels-1):
        float_img = cv2.pyrDown(float_img)
        pyramid.append(float_img)

    return pyramid

def build_video_pyramid(frames):
    """
    Erstellt eine Video-Pyramide, indem für jeden Frame eine Laplace-Pyramide erstellt wird.

    Für jeden Frame des Eingabevideos wird eine Gaußsche Pyramide erstellt, und diese Pyramiden werden
    zu einer Video-Pyramide zusammengesetzt.

    Args:
    frames (list of ndarray): Eine Liste von Frames, die das Video darstellen.

    Returns:
    list: Eine Liste von Pyramiden, jede repräsentiert einen Level der Video-Pyramide.
    """
    lap_video = []

    for i, frame in enumerate(frames):
        pyramid = build_gaussian_pyramid(frame, 3)
        for j in range(3):
            if i == 0:
                lap_video.append(np.zeros((len(frames), pyramid[j].shape[0], pyramid[j].shape[1], 3)))
            lap_video[j][i] = pyramid[j]

    return lap_video
