import os
import glob
import json
import torch
import torchaudio

from stable_audio_tools.interface.gradio import load_model
from stable_audio_tools.models.utils import apply_normalization


if __name__ == "__main__":
    ckpt_path = "/home/christian/christian/stable-audio-tools/checkpoints/vae/vae_model_unwrap-epoch=61-step=1350000.ckpt"
    model_config_path = "/home/christian/christian/stable-audio-tools/stable_audio_tools/configs/model_configs/autoencoders/stable_audio_2_0_vae_48khz.json"

    # load model from checkpoint

    if model_config_path is not None:
        # Load config from json file
        with open(model_config_path) as f:
            model_config = json.load(f)
    else:
        model_config = None

    device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
    model, model_config = load_model(
        model_config,
        ckpt_path,
        # pretrained_name=pretrained_name,
        # pretransform_ckpt_path=pretransform_ckpt_path,
        # model_half=model_half,
        device="cuda",
    )

    audio_paths = glob.glob(
        os.path.join("/app/suno/christian/data/minz-codec-comparison", "*.wav")
    )
    print(audio_paths)

    for audio_path in audio_paths:
        audio_in, sr = torchaudio.load(audio_path)

        if sr != 48000:
            audio_in = torchaudio.functional.resample(audio_in, sr, 48000)

        # loudness normalize to -16 dB
        # audio_in = apply_normalization(audio_in, 48000, target_loudness_lufs_db=-16.0)

        # start_frame = 524288
        # audio_in = audio_in[:, start_frame : start_frame + 524288]
        audio_in = audio_in.repeat(2, 1)
        audio_in = audio_in.cuda()
        audio_in /= audio_in.abs().max()

        with torch.no_grad():
            latents, encoder_info = model.encode(audio_in, return_info=True)
            decoded = model.decode(latents)

        print(decoded.abs().max())
        decoded /= decoded.abs().max()
        audio_in /= audio_in.abs().max()

        print(decoded.shape)

        basename = os.path.basename(audio_path).replace(".wav", "")
        input_filepath = os.path.join(
            "minz-codec-comparison-cycled", basename + "-input.wav"
        )
        output_filepath = os.path.join(
            "minz-codec-comparison-cycled", basename + "-decoded.wav"
        )

        torchaudio.save(input_filepath, audio_in.cpu().squeeze(0), 48000)
        torchaudio.save(output_filepath, decoded.cpu().squeeze(0), 48000)
