"""명시한 테스트 source에만 synthetic Anchor를 전달한다. raw RTP 추출/동기화 기능이 아니다."""
import json
import os
from pathlib import Path

from app.contracts.frames import FrameTime


def synthetic_anchor(source_id):
    path = os.environ.get('CONTEXTRA_TEST_FRAME_ANCHOR_FILE')
    if not path:
        return None
    try:
        p = Path(path)
        if not p.is_absolute() or p.is_symlink() or p.stat().st_size > 4096:
            raise ValueError()
        value = json.loads(p.read_text())
        if set(value) != {'sourceId', 'startWallTimeMs', 'rtpClockRate', 'synthetic'} or value['synthetic'] is not True:
            raise ValueError()
        if type(value['sourceId']) is not str or not value['sourceId']:
            raise ValueError()
        if type(value['startWallTimeMs']) is not int or not 0 <= value['startWallTimeMs'] <= 2**53-1:
            raise ValueError()
        if type(value['rtpClockRate']) is not int or not 0 < value['rtpClockRate'] <= 2**31-1:
            raise ValueError()
        if source_id != value['sourceId']:
            return None
        return FrameTime(anchor_wall_time_ms=value['startWallTimeMs'], rtp_clock_rate=value['rtpClockRate'],
                         sync_status='UNAVAILABLE', time_source='SYNTHETIC_TEST_ANCHOR')
    except (OSError, ValueError, TypeError, KeyError):
        raise ValueError('Invalid explicit test Anchor configuration.') from None
