# Runs tesseract on samples/* with each model set & language combo, scores vs gt/, writes CSVs.
import subprocess, glob, os, re, csv, jiwer, collections
KK="әғқңөұүһі"; MODELS={"fast(apt=tessdata_fast)":"models/fast","best(tessdata_best)":"models/best","web(test-ed-platform)":"models/web"}
LANGS=["eng+rus+kaz","kaz+rus","rus"]
norm=lambda s: re.sub(r"\s+"," ",s).strip()
os.makedirs("out",exist_ok=True); R=[]; P=[]
for img in sorted(glob.glob("samples/*")):
    name=os.path.basename(img).rsplit(".",1)[0]; gt=norm(open(f"gt/{name}.txt").read())
    for mk,md in MODELS.items():
        for lg in LANGS:
            hyp=norm(subprocess.run(["tesseract",img,"-","--tessdata-dir",md,"-l",lg,"--psm","3"],capture_output=True,text=True).stdout)
            open(f"out/{name}__{md.split('/')[1]}__{lg}.txt","w").write(hyp)
            co=jiwer.process_characters(gt,hyp); cer=co.cer; wer=jiwer.wer(gt,hyp)
            tot=collections.Counter(); ok=collections.Counter(); conf=collections.Counter()
            for ch in gt:
                if ch.lower() in KK: tot[ch.lower()]+=1
            for a in co.alignments[0]:
                if a.type=="equal":
                    for ch in gt[a.ref_start_idx:a.ref_end_idx]:
                        if ch.lower() in KK: ok[ch.lower()]+=1
                elif a.type=="substitute":
                    for r,h in zip(gt[a.ref_start_idx:a.ref_end_idx],hyp[a.hyp_start_idx:a.hyp_end_idx]):
                        if r.lower() in KK: conf[(r.lower(),h)]+=1
            T=sum(tot.values()); K=T-sum(ok.values())
            R.append(dict(sample=name,model=mk,lang=lg,CER=round(cer,4),WER=round(wer,4),kk_letters=T,kk_errors=K,kk_err_rate=round(K/T,4)))
            for l in KK: P.append(dict(sample=name,model=mk,lang=lg,letter=l,count=tot[l],errors=tot[l]-ok[l],err_rate=round((tot[l]-ok[l])/tot[l],4) if tot[l] else "",top_confusions="; ".join(f"{h}×{n}" for (r,h),n in conf.most_common() if r==l)[:80]))
for f,rows in [("results.csv",R),("per-letter.csv",P)]:
    w=csv.DictWriter(open(f,"w",newline=""),fieldnames=rows[0].keys()); w.writeheader(); w.writerows(rows)
for r in R: print(r)
