import wave
import struct
from pathlib import Path

from app.api.v1.mixer import AudioTrack, MixPayload, mix_tracks

def make_wav(path: Path, value: float, frames: int = 2400):
    path.parent.mkdir(parents=True, exist_ok=True)
    with wave.open(str(path), "wb") as wf:
        wf.setnchannels(1)
        wf.setsampwidth(2)
        wf.setframerate(24000)
        pcm = b"".join(struct.pack("<h", round(value * 32767)) for _ in range(frames))
        wf.writeframes(pcm)

def test_mix_two_timed_tracks(tmp_path):
    a = tmp_path / "dialogue.wav"
    b = tmp_path / "sfx.wav"
    out = tmp_path / "mix.wav"
    make_wav(a, 0.2)
    make_wav(b, 0.1)
    result = mix_tracks(MixPayload(
        tracks=[
            AudioTrack(path=str(a), start_ms=0, role="dialogue"),
            AudioTrack(path=str(b), start_ms=50, gain_db=-3, pan=0.5, role="sfx"),
        ],
        output_path=str(out),
    ))
    assert result["status"] == "COMPLETED"
    assert result["track_count"] == 2
    assert "dialogue" in result["roles"]
    assert "sfx" in result["roles"]
    assert out.exists()
    with wave.open(str(out), "rb") as wf:
        assert wf.getnchannels() == 2
        assert wf.getframerate() == 24000
