# -*- coding: utf-8 -*-
"""Ejemplo 18: Analizador de audio (niveles, FFT, loudness)."""

import sys
import time
import ctypes
from basskit.dlls.bass import bass
from basskit.constantes.bass import BASS_UNICODE, BASS_SAMPLE_FLOAT
from basskit.alto_nivel.analizador import Analizador


def barra(valor, ancho=30):
	"""Genera una barra visual ASCII."""
	lleno = int(valor * ancho)
	return "[" + "#" * lleno + "-" * (ancho - lleno) + "]"


def main():
	print("=== Analizador de Audio ===\n")
	if len(sys.argv) < 2:
		print("Uso: python 18_analizador.py <archivo_audio>")
		return

	bass.BASS_Init(-1, 44100, 0, 0, None)
	ruta = sys.argv[1].encode("utf-16-le") + b"\x00\x00"
	stream = bass.BASS_StreamCreateFile(0, ruta, 0, 0, BASS_UNICODE | BASS_SAMPLE_FLOAT)
	if stream == 0:
		print(f"Error: {bass.BASS_ErrorGetCode()}")
		bass.BASS_Free()
		return

	analizador = Analizador(stream)
	analizador.iniciar_loudness()
	bass.BASS_ChannelPlay(stream, 0)
	print(f"Reproduciendo: {sys.argv[1]}")
	print("Presiona Ctrl+C para detener.\n")

	try:
		while bass.BASS_ChannelIsActive(stream) == 1:
			# Niveles
			izq, der = analizador.nivel()
			print(f"  L {barra(izq)} {izq:.2f}")
			print(f"  R {barra(der)} {der:.2f}")

			# FFT (primeras 8 bandas)
			fft = analizador.fft(256)
			bandas_vis = fft[:8]
			fft_str = " ".join(f"{v:.2f}" for v in bandas_vis)
			print(f"  FFT: {fft_str}")

			# Loudness
			lufs = analizador.loudness_integrada()
			peak = analizador.true_peak()
			rango = analizador.loudness_range()
			print(f"  LUFS: {lufs:.1f} dB | Peak: {peak:.1f} dBFS | LRA: {rango:.1f}")

			print()  # Linea en blanco para separar
			time.sleep(0.5)
	except KeyboardInterrupt:
		print("\nDetenido.")

	analizador.detener_loudness()
	bass.BASS_StreamFree(stream)
	bass.BASS_Free()
	print("Fin del ejemplo.")


if __name__ == "__main__":
	main()
