import numpy as np

def save_amprente_digitale(rotation_angles, noise_patterns, output_path="amprente_digitale.npy"):
    """
    Genereaza fisierul amprente_digitale.npy
    Parametri:
    ----------
    rotation_angles : dict
        Dictionar de forma:
        {
            "A": angle_A,
            "B": angle_B,
            ...
            "8": angle_8
        }

    noise_patterns : dict
        Dictionar de forma:
        {
            "A": noise_A,   # matrice 28x28
            "B": noise_B,
            ...
            "8": noise_8
        }

    output_path : str
        Calea unde se salvează fișierul .npy

    Returneaza:
    -----------
    submission_dict : dict
        Dictionarul complet salvat in fisier.
    """
    required_chars = ["A", "B", "E", "F", "O", "I", "0", "1", "2", "4", "7", "8"]
    submission_dict = {}
    for ch in required_chars:
        if ch not in rotation_angles:
            raise ValueError(f"Lipseste unghiul pentru caracterul '{ch}'")
        if ch not in noise_patterns:
            raise ValueError(f"Lipseste zgomotul pentru caracterul '{ch}'")
        noise = np.array(noise_patterns[ch])
        if noise.shape != (28, 28):
            raise ValueError(
                f"Zgomotul pentru '{ch}' trebuie sa aibă dimensiunea (28, 28), dar are {noise.shape}"
            )
        submission_dict[ch] = {
            "angle": float(rotation_angles[ch]),
            "noise": noise
        }
    np.save(output_path, submission_dict, allow_pickle=True)
    return submission_dict

# Exemplu de utilizare
rotation_angles = {
    "A": -12, "B": 7, "E": 3, "F": -18, "O": 10, "I": -5,
    "0": 6, "1": -9, "2": 14, "4": -2, "7": 11, "8": -7
}
noise_patterns = {
    ch: np.ones((28, 28)) * 255 for ch in rotation_angles
}
save_amprente_digitale(rotation_angles, noise_patterns)
