#pragma once

#include <SDL3/SDL.h>

#include <cstdint>
#include <optional>
#include <vector>

// Forward-declaració per no incloure jail_audio.hpp (cicle d'inclusió: este
// header viu sota los params declarats a jail_audio.hpp, i alhora jail_audio
// usa applyEcho/applyReverb).
namespace Ja {
    struct Sound;
    struct EchoParams;
    struct ReverbParams;
}  // namespace Ja

// Processadors d'efectes para sons puntuals. Reben un Ja::Sound (qualsevol
// format suportat pel decodificador WAV: U8/S16, mono o estèreo) i tornen un
// buffer PCM en S16 + el seu spec, llest per empenyer a un SDL_AudioStream.
//
// El buffer de sortida inclou la cua (decay) generada per l'efecte: per al
// reverb, hasta a 1500 ms; para l'eco, hasta a 800 ms. Aquests caps eviten
// allargar indefinidament la reproducció cuando los parámetros reinjecten mucho.
//
// Si el format del so d'origen no es pot processar, retornen std::nullopt
// (el caller ha de fer fallback a reproducció seca).
namespace AudioEffects {

    struct ProcessedSound {
        std::vector<std::uint8_t> bytes;  // PCM S16 entrellaçat (LRLRLR... si stereo)
        SDL_AudioSpec spec;               // Format/canals/freqüència del buffer
    };

    [[nodiscard]] auto applyEcho(const Ja::Sound& src, const Ja::EchoParams& params) -> std::optional<ProcessedSound>;
    [[nodiscard]] auto applyReverb(const Ja::Sound& src, const Ja::ReverbParams& params) -> std::optional<ProcessedSound>;

}  // namespace AudioEffects
