# -*- coding: utf-8 -*-
"""Ejemplo 15: Cadena de efectos BASS_FX (alto nivel)."""

import sys
import time
from basskit.alto_nivel import inicializar, liberar
from basskit.alto_nivel.efectos import CadenaEfectos
from basskit.dlls.bass import bass
from basskit.constantes.bass import BASS_UNICODE, BASS_STREAM_DECODE, BASS_SAMPLE_FLOAT
from basskit.dlls.bass_fx import bass_fx
from basskit.constantes.bass_fx import BASS_FX_FREESOURCE


def main():
	print("=== Cadena de Efectos BASS_FX (15 efectos) ===\n")
	if len(sys.argv) < 2:
		print("Uso: python 15_cadena_efectos.py <archivo_audio>")
		return

	inicializar()
	ruta = sys.argv[1].encode("utf-16-le") + b"\x00\x00"
	decode = bass.BASS_StreamCreateFile(0, ruta, 0, 0, BASS_STREAM_DECODE | BASS_UNICODE | BASS_SAMPLE_FLOAT)
	stream = bass_fx.BASS_FX_TempoCreate(decode, BASS_FX_FREESOURCE)
	if stream == 0:
		print(f"Error: {bass.BASS_ErrorGetCode()}")
		liberar()
		return

	cadena = CadenaEfectos(stream)
	bass.BASS_ChannelPlay(stream, 0)
	print(f"Reproduciendo: {sys.argv[1]}")
	print(f"Efectos disponibles: {len(cadena.efectos_disponibles())}\n")

	# Probar cada efecto BFX uno por uno
	efectos_bfx = [
		("bfx_echo", "Echo BFX"),
		("bfx_flanger", "Flanger BFX"),
		("bfx_reverb", "Reverb BFX"),
		("bfx_lpf", "Filtro Paso Bajo"),
		("bfx_damp", "Amplificacion Dinamica"),
		("bfx_autowah", "AutoWah"),
		("bfx_echo2", "Echo 2 (avanzado)"),
		("bfx_phaser", "Phaser"),
		("bfx_echo3", "Echo 3 (stereo)"),
		("bfx_chorus", "Chorus BFX"),
		("bfx_apf", "Filtro Pasa-Todo"),
		("bfx_compressor", "Compresor BFX"),
		("bfx_distortion", "Distorsion BFX"),
		("bfx_compressor2", "Compresor 2 (avanzado)"),
		("bfx_bqf", "Filtro BiQuad (lowpass)"),
	]

	print("[0] Sin efectos - 2 seg")
	time.sleep(2)

	for i, (clave, nombre) in enumerate(efectos_bfx, 1):
		ok = cadena.agregar(clave)
		estado = "ON" if ok else "FALLO"
		print(f"[{i}/{len(efectos_bfx)}] {nombre}: {estado} - 2.5 seg")
		time.sleep(2.5)
		cadena.quitar(clave)

	# Demostrar cadena multiple
	print("\n--- Cadena multiple: Echo + Phaser + Chorus ---")
	cadena.agregar("bfx_echo2")
	cadena.agregar("bfx_phaser")
	cadena.agregar("bfx_chorus")
	print(f"Activos: {cadena.activos}")
	time.sleep(4)

	# Bypass
	print("Bypass del Phaser...")
	cadena.bypass("bfx_phaser", True)
	time.sleep(2)
	print("Phaser reactivado")
	cadena.bypass("bfx_phaser", False)
	time.sleep(2)

	# Limpiar todo
	cadena.limpiar()
	print(f"Limpiado. Activos: {cadena.activos}")
	time.sleep(2)

	bass.BASS_StreamFree(stream)
	liberar()
	print("\nFin del ejemplo.")


if __name__ == "__main__":
	main()
