from pathlib import Path
import wave, struct

from app.api.v1.mastering import MasterPayload, MasterTrack, master_scene, _duck_envelope

def make_wav(path: Path, value: float, frames: int = 4800):
    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_duck_envelope_reduces_music_during_dialogue():
    dialogue=[0.0]*1200+[0.5]*1200+[0.0]*1200
    env=_duck_envelope(dialogue,24000,10,20,50)
    assert min(env[1200:2400]) < 1.0
    assert env[100] > env[1500]

def test_master_creates_stereo_master(tmp_path):
    dialogue=tmp_path/"dialogue.wav"; music=tmp_path/"music.wav"; out=tmp_path/"master.wav"
    make_wav(dialogue,0.4); make_wav(music,0.2)
    result=master_scene(MasterPayload(
        tracks=[
            MasterTrack(path=str(dialogue),role="dialogue"),
            MasterTrack(path=str(music),role="music",start_ms=0)
        ],
        output_path=str(out),
        sample_rate=24000,
        enable_ducking=True
    ))
    assert result["status"]=="COMPLETED"
    assert result["ducking_enabled"] is True
    assert result["final_peak_dbfs"] <= -0.9
    with wave.open(str(out),"rb") as wf:
        assert wf.getnchannels()==2
