"""AGNT Scrape client. Supply explicit idempotency keys for recoverable calls."""
import json,uuid,urllib.request,urllib.error,urllib.parse
class ScrapeClient:
    def __init__(self,key,origin='https://scrape.agnt.gg'):
        self.key,self.origin=key,origin
    def request(self,path,body=None,idempotency_key=None):
        key=idempotency_key or str(uuid.uuid4())
        request=urllib.request.Request(self.origin+'/scrape/v1'+path,data=json.dumps(body).encode() if body is not None else None,headers={'Authorization':'Bearer '+self.key,'Content-Type':'application/json','Idempotency-Key':key})
        try:
            with urllib.request.urlopen(request,timeout=60) as response:return json.load(response)
        except urllib.error.HTTPError as error:
            result=json.load(error)
            raise RuntimeError({'status':error.code,'result':result,'idempotencyKey':key}) from None
    def parse(self,data,extension,formats=('markdown',),idempotency_key=None,content_type='application/octet-stream',**options):
        """Upload a file you already hold (bytes). Same response and price as a scrape."""
        key=idempotency_key or str(uuid.uuid4())
        query=urllib.parse.urlencode({'extension':extension,'formats':','.join(formats),**{k:str(v) for k,v in options.items()}})
        request=urllib.request.Request(self.origin+'/scrape/v1/parse?'+query,data=data,headers={'Authorization':'Bearer '+self.key,'Content-Type':content_type,'Idempotency-Key':key})
        try:
            with urllib.request.urlopen(request,timeout=60) as response:return json.load(response)
        except urllib.error.HTTPError as error:
            raise RuntimeError({'status':error.code,'result':json.load(error),'idempotencyKey':key}) from None
    def scrape(self,url,idempotency_key=None,**options):
        """formats={'markdown':True,'links':True}. Every requested format comes from one visit and costs one page."""
        return self.request('/scrape',dict(url=url,**options),idempotency_key)
