"""Join small PCM16 WAV byte strings in explicit order; memory-only demo."""
import io,wave,struct,json
def wav_bytes(values,rate=8000,channels=1,width=2):
    data=struct.pack('<'+'h'*len(values),*values) if width==2 else bytes(values)
    sink=io.BytesIO()
    with wave.open(sink,'wb') as f:
        f.setnchannels(channels);f.setsampwidth(width);f.setframerate(rate);f.writeframes(data)
    return sink.getvalue()
def join(parts):
    if not parts:raise ValueError('nonempty ordered list required')
    state=None;data=[];frames=0
    for raw in parts:
        if len(raw)>1000000:raise ValueError('demo input cap: one million bytes per part')
        with wave.open(io.BytesIO(raw),'rb') as f:
            current=(f.getnchannels(),f.getsampwidth(),f.getframerate(),f.getcomptype())
            if current[0] not in (1,2) or current[1]!=2 or current[3]!='NONE':raise ValueError('PCM16 mono/stereo only')
            if state is not None and current!=state:raise ValueError('incompatible audio parameters')
            state=current;n=f.getnframes();payload=f.readframes(n+1)
            if len(payload)!=n*current[0]*current[1]:raise ValueError('truncated PCM')
            data.append(payload);frames+=n
    sink=io.BytesIO()
    with wave.open(sink,'wb') as f:
        f.setnchannels(state[0]);f.setsampwidth(state[1]);f.setframerate(state[2]);f.writeframes(b''.join(data))
    return sink.getvalue(),{'frames':frames,'rate':state[2],'duration_seconds':frames/state[2],'channels':state[0]}
if __name__=='__main__':
    a=wav_bytes([100,-100,0,50]);b=wav_bytes([-50,0,200]);out,report=join([a,b])
    with wave.open(io.BytesIO(out),'rb') as f:values=struct.unpack('<7h',f.readframes(7))
    assert values==(100,-100,0,50,-50,0,200) and report['frames']==7 and report['duration_seconds']==7/8000
    reverse,_=join([b,a]);assert reverse!=out
    def partial_frame(raw):
        at=raw.index(b'data');size=struct.unpack('<I',raw[at+4:at+8])[0]-1
        body=raw[8:at+4]+struct.pack('<I',size)+raw[at+8:at+8+size]+(b'\0' if size%2 else b'')
        return b'RIFF'+struct.pack('<I',len(body))+body
    partial_mono=partial_frame(a);partial_stereo=partial_frame(wav_bytes([1,2,3,4],8000,2))
    rejected=0
    for parts in [[],[a,wav_bytes([0],16000)],[a,wav_bytes([0,0],8000,2)],[a,wav_bytes([128],8000,1,1)],[a,b[:-1]],[partial_mono],[partial_stereo]]:
        try:join(parts)
        except (ValueError,wave.Error,EOFError):rejected+=1
    assert rejected==7
    print(json.dumps({'output_samples':values,'report':report,'incompatible_or_truncated_cases_rejected':rejected,'sample_values_and_order_verified':True,'audio_played':False,'files_written':0},indent=2))
