import json
from pathlib import Path
import subprocess
import tempfile
import unittest

from media import import_asr, inspect_recording


class IntakeTests(unittest.TestCase):
    def test_duplicates_silence_and_early_asr(self):
        with tempfile.TemporaryDirectory() as temporary:
            folder = Path(temporary)
            source = folder / 'source.mkv'
            subprocess.run(['ffmpeg', '-v', 'error', '-f', 'lavfi', '-i', 'color=size=160x90:rate=10:duration=3',
                            '-f', 'lavfi', '-i', 'sine=frequency=500:duration=1', '-f', 'lavfi', '-i', 'anullsrc=r=16000:cl=mono',
                            '-filter_complex', '[1:a]adelay=800,apad,atrim=duration=3[delayed]', '-map', '0:v', '-map', '[delayed]',
                            '-map', '2:a', '-c:v', 'ffv1', '-c:a', 'pcm_s16le', '-t', '3', str(source)], check=True)
            with self.assertRaisesRegex(ValueError, 'Distinct audio tracks'):
                inspect_recording(source, folder / 'ambiguous')
            with self.assertRaisesRegex(ValueError, 'silent/near-silent'):
                inspect_recording(source, folder / 'silent', 2)
            intake = inspect_recording(source, folder / 'intake', 1)
            asr = folder / 'raw.json'
            asr.write_text(json.dumps({'segments': [{'words': [{'word': 'Moss', 'start': 0, 'end': 1.1, 'probability': .6}]}]}))
            result = import_asr(folder / 'intake/intake.json', asr, folder / 'transcript.json', 'test-estimator', 'synthetic-1', ['moss'])
            onset = next(item for item in result['uncertainties'] if item['kind'] == 'timestamp-over-low-energy')
            self.assertAlmostEqual(onset['candidate_acoustic_onset_seconds'], .8, places=2)
            self.assertEqual(result['words'][0]['start_seconds'], 0)
            self.assertEqual(len(result['uncertainties']), 2)
            self.assertEqual(result['source_sha256'], intake['source_sha256'])


if __name__ == '__main__':
    unittest.main()
