import hashlib
import json
import sys
from pathlib import Path

sys.path.insert(0, str(Path('tools/audio').resolve()))
from sfxgen import find_ffmpeg, validate_audio

root = Path.cwd()
manifest_path = root / 'logs/evidence/SFX-BATCH-20261004-01/batch.json'
manifest = json.loads(manifest_path.read_text())
ffmpeg = find_ffmpeg()
if not ffmpeg:
    raise SystemExit('MP3 verification requires FFmpeg')
results = []
for request in manifest['requests']:
    takes = []
    for relative in request['expectedPaths']:
        path = root / relative
        if not path.is_file() or path.stat().st_size <= 0:
            raise SystemExit(f'Missing or empty output: {relative}')
        info = validate_audio(path, request['seconds'], 'mp3', ffmpeg)
        if info['sample_rate'] != 44100 or info['channels'] != 2:
            raise SystemExit(f'Unexpected format for {relative}: {info}')
        if info['peak_dbfs'] > -3.0:
            raise SystemExit(f'Peak above -3 dBFS for {relative}: {info["peak_dbfs"]}')
        info['path'] = relative
        info['sha256'] = hashlib.sha256(path.read_bytes()).hexdigest()
        takes.append(info)
    request['verified'] = True
    request['verification'] = takes
    results.extend(takes)
manifest['verification'] = {
    'status': 'passed',
    'method': 'sfxgen.validate_audio plus full FFmpeg decode',
    'sample_rate': 44100,
    'channels': 2,
    'file_count': len(results),
    'all_nonempty_finite_nonsilent': True,
    'peak_ceiling_dbfs': -3.0,
}
manifest_path.write_text(json.dumps(manifest, indent=2) + '\n')
verification_path = root / 'logs/evidence/SFX-BATCH-20261004-01/verification.json'
verification_path.write_text(json.dumps({'status': 'passed', 'files': results}, indent=2) + '\n')
print(f'PASS: {len(results)} MP3 files decoded and verified; 44.1 kHz stereo, finite/non-silent, requested duration, peaks <= -3 dBFS.')
for request in manifest['requests']:
    peaks = ', '.join(f'{take["peak_dbfs"]:.3f} dBFS' for take in request['verification'])
    print(f'{request["id"]}: {len(request["verification"])} takes at {request["seconds"]} s; peaks {peaks}')
