"""Bounded real-provider checks. Saves no signed URLs, cookies, or tokens."""
import json
import time
from pathlib import Path
from urllib.request import Request, urlopen
from urllib.error import HTTPError, URLError
from catalog import Addon
from provider import ProviderError


def run():
    addon=Addon(); report={'version':'1.1.3','checks':[]}
    for kind in ('movie','series'):
        for tail in ('top.json','year.json','imdbRating.json','top/skip=100.json'):
            try:
                data=addon.dispatch('/catalog/'+kind+'/'+tail)
                row={'catalog':kind+'/'+tail,'count':len(data.get('metas',[]))}
            except (ProviderError,ValueError) as error:
                row={'catalog':kind+'/'+tail,'error':str(error)}
            report['checks'].append(row); print(json.dumps(row),flush=True)
    cases=[('movie','tt0816692','Interstellar'),('series','tt1475582:1:1','Sherlock S01E01'),('series','tt0903747:2:1','Breaking Bad S02E01')]
    for kind,ident,title in cases:
        row={'title':title}
        try:
            root=ident.split(':')[0]; meta=addon.dispatch('/meta/'+kind+'/'+root+'.json')['meta']; row['metadata']=meta['name']
            selected=addon.resolve(kind,root,meta); row['candidateCount']=len(selected)
            streams=addon.dispatch('/stream/'+kind+'/'+ident+'.json')['streams']; row['streamCount']=len(streams)
            if streams:
                stream=streams[0]; headers=dict(stream.get('behaviorHints',{}).get('proxyHeaders',{}).get('request',{})); headers['Range']='bytes=0-65535'
                try:
                    with urlopen(Request(stream['url'],headers=headers),timeout=15) as response:
                        data=response.read(65536); row['mediaHTTP']=response.status; row['recognizedManifest']=b'<MPD' in data or b':MPD' in data or data.startswith(b'#EXTM3U') or b'ftyp' in data[:64]
                except HTTPError as error: row['mediaHTTP']=error.code
            row['fullPlaybackVerified']=False
        except (ProviderError,ValueError,TypeError,URLError,OSError) as error:
            row['error']=str(error) if isinstance(error,ProviderError) else 'Metadata/network/response issue'
        report['checks'].append(row); print(json.dumps(row),flush=True)
        time.sleep(1)
    Path(__file__).with_name('live-results.json').write_text(json.dumps(report,indent=2))


if __name__=='__main__': run()
