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()
evidence = root / 'logs/evidence/SFX-REFRESH-20261004-01'
manifest_path = evidence / 'regeneration.json'
manifest = json.loads(manifest_path.read_text())
ffmpeg = find_ffmpeg()
if not ffmpeg:
    raise SystemExit('FFmpeg is required for full MP3 decode')
all_files = []
for request in manifest['requests']:
    old_hashes = {x['path']: x['sha256'] for x in request['previousSha256']}
    actual_hashes = []
    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 replacement: {relative}')
        info = validate_audio(path, request['seconds'], 'mp3', ffmpeg)
        if info['sample_rate'] != 44100 or info['channels'] != 2 or info['peak_dbfs'] > -3:
            raise SystemExit(f'Format or peak validation failed: {relative}: {info}')
        digest = hashlib.sha256(path.read_bytes()).hexdigest()
        if digest == old_hashes[relative]:
            raise SystemExit(f'File was not replaced: {relative}')
        info.update({'path': relative, 'sha256': digest})
        takes.append(info)
        actual_hashes.append(digest)
        all_files.append(info)
    if len(set(actual_hashes)) != len(actual_hashes):
        raise SystemExit(f'Duplicate takes found for {request["id"]}')
    request['verified'] = True
    request['verification'] = takes
manifest['verification'] = {
    'status': 'passed', 'method': 'wrapper validator plus full FFmpeg decode',
    'file_count': len(all_files), 'sample_rate': 44100, 'channels': 2,
    'nonempty_finite_nonsilent': True, 'peak_ceiling_dbfs': -3,
    'all_replaced_hashes_changed': True, 'unique_takes_per_request': True,
}
manifest_path.write_text(json.dumps(manifest, indent=2) + '\n')
(evidence / 'verification.json').write_text(json.dumps({'status': 'passed', 'files': all_files}, indent=2) + '\n')
print(f'PASS: all {len(all_files)} replacement MP3s decode and validate; every file changed from its prior hash and takes are distinct.')
for request in manifest['requests']:
    peaks = ', '.join(f'{x["peak_dbfs"]:.3f} dBFS' for x in request['verification'])
    print(f'{request["id"]}: {len(request["verification"])} takes, {request["seconds"]} s each, peaks {peaks}')
