"""Renderiza a interface real com respostas inteiramente sintéticas, sem servidor externo."""
import json, pathlib, datetime
from playwright.sync_api import sync_playwright
root=pathlib.Path(__file__).resolve().parents[1]
css=(root/'public/app.css').read_text()
js=(root/'public/app.js').read_text()
html=(root/'public/index.html').read_text()
now=datetime.datetime.now()
def start(h=9,ds=0):
 d=now.replace(hour=h,minute=30,second=0,microsecond=0)+datetime.timedelta(days=ds)
 return d.strftime('%Y-%m-%dT%H:%M')
mock={
 '/api/session':{'configured':True,'authenticated':True,'csrf':'sample','user':{'id':1,'name':'Dr. Júlio Carvalho','email':'julio@demo.local','role':'admin','crm':'123456','uf':'RJ','clinic':'Clínica Aurora'}},
 '/api/dashboard':{'stats':{'patients':128,'today':12,'upcoming':27,'documents':86},
 'upcoming':[{'starts_at':start(9),'patient':'Mariana Oliveira','doctor':'Dr. Júlio Carvalho','kind':'Consulta','status':'confirmado'}, {'starts_at':start(10),'patient':'Lucas Ferreira','doctor':'Dr. Júlio Carvalho','kind':'Retorno','status':'agendado'}, {'starts_at':start(11),'patient':'Ana Beatriz Costa','doctor':'Dr. Júlio Carvalho','kind':'Avaliação','status':'confirmado'}, {'starts_at':start(14),'patient':'Roberto Almeida','doctor':'Dr. Júlio Carvalho','kind':'Consulta','status':'agendado'}],
 'recent':[{'id':1,'created_at':start(9),'patient':'Camila Santos','reason':'Evolução de rotina','status':'rascunho'},{'id':2,'created_at':start(10),'patient':'Gabriel Martins','reason':'Consulta de retorno','status':'finalizado'}],
 'chart':[{'month':(now.replace(day=1)-datetime.timedelta(days=30*(5-i))).strftime('%Y-%m'),'count':n} for i,n in enumerate([12,17,14,21,26,33])] },
 '/api/patients':[{'id':i+1,'name':name,'cpf':'','phone':'(21) 99999-1234','email':'','birth_date':'1988-04-12','active':1} for i,name in enumerate(['Mariana Oliveira','Lucas Ferreira','Ana Beatriz Costa','Roberto Almeida'])],
 '/api/doctors':[{'id':1,'name':'Dr. Júlio Carvalho','active':1,'role':'admin','crm':'123456','uf':'RJ'}],
 '/api/appointments':[], '/api/encounters':[], '/api/documents':[], '/api/triages':[]
}
pre='''window.fetch = async function(url){const p=String(url); const data = MOCK[p.split("?")[0]]??[];return {ok:true,status:200,json:async()=>data};};'''.replace('MOCK', json.dumps(mock,ensure_ascii=False))
html=html.replace('<link rel="stylesheet" href="/app.css">',f'<style>{css}</style>')
html=html.replace('<script type="module" src="/app.js"></script>',f'<script>{pre}</script><script>{js}</script>')
with sync_playwright() as p:
 browser=p.chromium.launch(headless=True, executable_path='/usr/bin/chromium',args=['--no-sandbox'])
 for key,w,h in [('desktop',1440,960),('mobile',390,844)]:
  page=browser.new_page(viewport={'width':w,'height':h},is_mobile=key=='mobile',has_touch=key=='mobile',device_scale_factor=1)
  errors=[];page.on('pageerror',lambda e:errors.append(str(e)))
  page.set_content(html,wait_until='load')
  page.locator('text=Próximos atendimentos').wait_for(timeout=10000)
  page.screenshot(path=str(root/f'preview-{key}.png'),full_page=True)
  print(key,'dashboard:',page.locator('h1').first.inner_text(),'page errors:',errors)
  page.locator('[data-go="patients"]').first.click() if key=='desktop' else page.locator('[data-go="patients"]').last.click()
  page.locator('text=Mariana Oliveira').first.wait_for()
  print(key,'patient rows:',page.locator('tbody tr').count())
  page.close()
 browser.close()
