import re, os, json
OUT='/home/claude/school'
MIGS=['hr','setup','students','admissions','academics','attendance','exams','fees','communication','inventory','hostel','facilities','transport','library','canteen','system']
MODULES={}   # key -> dict(label, icon, resources[], extras[])
RES={}       # slug -> config
TABLES={}    # table -> dict(model, cols, mig, extra, uniques)
cur_mod=None; cur_mig=None
IRR={'classes':'class','staff':'staff','alumni':'alumnus','homework':'homework','curricula':'curriculum','bus_attendance':'bus_attendance','student_medical':'student_medical'}
MODEL_OVERRIDE={'classes':'SchoolClass'}
def sing_word(w):
    if w in IRR: return IRR[w]
    if w.endswith('ies'): return w[:-3]+'y'
    if w.endswith('s') and not w.endswith('ss'): return w[:-1]
    return w
def singular(t):
    if t in IRR: return IRR[t]
    parts=t.split('_'); parts[-1]=sing_word(parts[-1]); return '_'.join(parts)
def camel(s): 
    p=s.split('_'); return p[0]+''.join(x.title() for x in p[1:])
def studly(s): return ''.join(x.title() for x in s.split('_'))
def model_of(t): return MODEL_OVERRIDE.get(t) or studly(singular(t))
def mod(key,label,icon,extras=None):
    global cur_mod; cur_mod=key
    if key not in MODULES: MODULES[key]=dict(label=label,icon=icon,resources=[],extras=[])
    if extras: MODULES[key]['extras']=extras
def mig(k):
    global cur_mig; cur_mig=k
TOK=re.compile(r'^(?P<name>[a-z_0-9]+)(?:>(?P<fk>[a-z_]+))?(?::(?P<type>[a-z]+)(?:\((?P<enum>[^)]*)\))?)?(?:=(?P<def>[^?!]+))?(?P<null>\?)?(?P<uniq>!)?$')
def parse(cols):
    out=[]
    for tk in cols.split():
        m=TOK.match(tk); assert m, tk
        d=m.groupdict(); t=d['type'] or 's'
        if d['fk']: t='fk'
        if d['name'].endswith('_path') and t=='s': t='f'
        out.append(dict(name=d['name'],type=t,fk=d['fk'],enum=d['enum'].split('|') if d['enum'] else None,default=d['def'],null=bool(d['null']),uniq=bool(d['uniq'])))
    return out
def T(table,label,cols,slug=None,reuse=False,extra='',uniques=None,list=None,search=None,fixed=None,actions=None,own=None,plural=None,notes=None):
    slug=slug or table
    cs=parse(cols)
    if not reuse:
        TABLES[table]=dict(model=model_of(table),cols=cs,mig=cur_mig,extra=extra,uniques=uniques or [])
    cs=TABLES[table]['cols']
    RES[slug]=dict(table=table,label=label,plural=plural or label+'s',module=cur_mod,cols=cs,list=list,search=search,fixed=fixed,actions=actions or [],own=own,notes=notes)
    MODULES[cur_mod]['resources'].append(slug)
