import time,re,json,requests,io
import numpy as np
from PIL import Image, ImageFilter
from selenium import webdriver
from selenium.webdriver.firefox.options import Options
urllib3=__import__('urllib3'); urllib3.disable_warnings()
o=Options(); o.set_preference('dom.webdriver.enabled',False)
o.set_preference('network.http.referer.spoofSource',True)
o.set_preference('network.http.referer.defaultReferrer','https://ein38eu95792b.4656hd15.cc/')
d=webdriver.Firefox(options=o)
try:
    d.get('http://127.0.0.1:9999/geetest_page.html')
    for _ in range(30):
        time.sleep(0.4)
        if d.execute_script("return document.querySelectorAll('.geetest_bg').length>0"): break
    time.sleep(1.5)
    info=d.execute_script("""function r(s){var e=document.querySelector(s);if(!e)return null;var b=e.getBoundingClientRect();return {t:b.top,l:b.left,w:b.width,h:b.height,bg:getComputedStyle(e).backgroundImage};}return {bg:r('.geetest_bg'),slice:r('.geetest_slice'),slicebg:r('.geetest_slice_bg'),btn:r('.geetest_btn')};""")
    print('rects',json.dumps(info)[:500])
    def dl(u):
        m=re.search(r'url\("?([^")]+)"?\)',u or '');return requests.get(m.group(1).replace('http://','https://'),timeout=20,verify=False).content
    bg=Image.open(io.BytesIO(dl(info['bg']['bg']))).convert('RGB')
    sl=Image.open(io.BytesIO(dl(info['slicebg']['bg']))).convert('RGBA')
    bg.to_png if False else None
    bg.save('diag_bg.png'); sl.save('diag_sl.png')
    binfo=Image.open(io.BytesIO(requests.get(re.search(r'url\("?([^")]+)"?\)',info['bg']['bg']).group(1).replace('http://','https://'),verify=False).content))
    print('sizes',binfo.size,sl.size,'css',info['bg']['w'],info['bg']['h'],'top_css',info['slice']['t']-info['bg']['t'])
    gra=np.array(bg).astype(np.float32); gray=gra.mean(2)
    sa=np.array(sl).astype(np.float32); mask=sa[:,:,3]>128
    # contour
    from scipy import ndimage
    er=ndimage.binary_erosion(mask,iterations=1); di=ndimage.binary_dilation(mask,iterations=1)
    contour=di&~er
    edges=np.array(bg.convert('L').filter(ImageFilter.FIND_EDGES)).astype(np.float32)
    dark=(gray<90)
    h,w=mask.shape; H,W=gray.shape
    top=int(round((info['slice']['t']-info['bg']['t'])*H/info['bg']['h']))
    top=max(0,min(H-h,top))
    res=[]
    for x in range(0,W-w+1):
        m=gray[top:top+h,x:x+w][mask].mean()
        e=edges[top:top+h,x:x+w][contour].mean() if contour.sum() else 0
        iou=(dark[top:top+h,x:x+w]&mask).sum()/mask.sum()
        res.append((x,m,e,iou))
    print('dark top5',sorted(res,key=lambda r:r[1])[:5])
    print('edge top5',sorted(res,key=lambda r:-r[2])[:5])
    print('iou top5',sorted(res,key=lambda r:-r[3])[:5])
finally:
    d.quit()
