from html.parser import HTMLParser
from pathlib import Path
import sys
class P(HTMLParser):
 def __init__(self):
  super().__init__();self.tags=[];self.attrs=[];self.labels_for=set();self.ids=set();self.fieldsets=0;self.legends=0;self.h=[];self.native_buttons=0;self.redundant=[]
 def handle_starttag(self,t,a):
  d=dict(a);self.tags.append(t);self.attrs.append((t,d))
  if 'id' in d:self.ids.add(d['id'])
  if t=='label' and 'for' in d:self.labels_for.add(d['for'])
  if t=='fieldset':self.fieldsets+=1
  if t=='legend':self.legends+=1
  if t in ('h1','h2','h3','h4','h5','h6'):self.h.append(int(t[1]))
  if t=='button':self.native_buttons+=1
  if t=='main' and d.get('role')=='main':self.redundant.append('main role=main')
  if t=='nav' and d.get('role')=='navigation':self.redundant.append('nav role=navigation')
def check(path):
 p=P();p.feed(Path(path).read_text(encoding='utf-8'));errs=[]
 if p.tags.count('main')!=1:errs.append('exactly one main required')
 if 'article' not in p.tags:errs.append('article required')
 if 'nav' not in p.tags:errs.append('nav required')
 if p.h.count(1)!=1:errs.append('exactly one h1 required')
 if not any(x==2 for x in p.h):errs.append('at least one h2 required')
 if 'form' not in p.tags:errs.append('form required')
 controls=[d.get('id') for t,d in p.attrs if t in ('input','select','textarea') and d.get('id') and d.get('type') not in ('radio','checkbox','hidden')]
 for c in controls:
  if c not in p.labels_for:errs.append('visible associated label missing for '+c)
 radios=[(t,d) for t,d in p.attrs if t=='input' and d.get('type')=='radio']
 if radios and not (p.fieldsets>=1 and p.legends>=1):errs.append('radio group needs fieldset and legend')
 if p.native_buttons<1:errs.append('native button required')
 errs += ['redundant landmark semantics: '+x for x in p.redundant]
 return errs
if __name__=='__main__':
 e=check(sys.argv[1]);print('PASS' if not e else 'FAIL');[print('-',x) for x in e];sys.exit(0 if not e else 1)
