# -*- coding: utf-8 -*-
import sys, io
sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding='utf-8')
"""
Uji Akurasi OCR - Word Error Rate (WER) & Character Error Rate (CER)
Menggunakan library: jiwer
Install: pip install jiwer pandas openpyxl
"""

import pandas as pd
# pyrefly: ignore [missing-import]
from jiwer import wer, cer

# ─────────────────────────────────────────────
# ISI DATA: ground_truth vs hasil_ocr
# ground_truth = teks ASLI dari menu (ketik manual)
# hasil_ocr    = teks yang terbaca oleh Google Vision OCR
# ─────────────────────────────────────────────

data_ocr = [
    # (foto_id, ground_truth, hasil_ocr)
    # ✅ = terbaca sempurna | ⚠️ = ada karakter salah
    ("F01", "Kopi Susu Gula Aren 18000",       "Kopi Susu Gula Aren 18000"),       # ✅
    ("F02", "Matcha Latte 20000",               "Matcha Latte 20000"),               # ✅
    ("F03", "Es Teh Manis 8000",                "Es Teh Manis 8000"),                # ✅
    ("F04", "Roti Bakar Coklat 15000",          "Roti Bakar Coklat 15000"),          # ✅
    ("F05", "Americano 16000",                  "Americano 16000"),                  # ✅
    ("F06", "Caramel Macchiato 22000",          "Caramel Macchiato 22000"),          # ✅
    ("F07", "Es Kopi Susu 18000",               "Es Kopi Susu 18000"),               # ✅
    ("F08", "Lemon Tea 12000",                  "Lemon Tea 12000"),                  # ✅
    ("F09", "Croissant Butter 18000",           "Croisssant Butter 18000"),          # ⚠️ "Croisssant"
    ("F10", "French Fries 15000",               "French Fries 15000"),               # ✅
    ("F11", "Cappuccino 19000",                 "Cappuccino 19000"),                 # ✅
    ("F12", "Waffle Coklat 22000",              "Waffle Coklat 22000"),              # ✅
    ("F13", "Es Kopi Aren 20000",               "Es Kopi Aren 20000"),               # ✅
    ("F14", "Pisang Goreng Keju 12000",         "Pisang Goreng Keju 12000"),         # ✅
    ("F15", "Hot Chocolate 18000",              "Hot Chocolate 18000"),              # ✅
    ("F16", "Nasi Goreng Spesial 25000",        "Nasi Goreng Spesial 25000"),        # ✅
    ("F17", "Smoothie Strawberry 20000",        "Smoothie Strawberry 20000"),        # ✅
    ("F18", "Roti Bakar Keju 15000",            "Roti Bakar Keju 15000"),            # ✅
    ("F19", "Cold Brew Coffee 22000",           "Cold Brew Coffee 22000"),           # ✅
    ("F20", "Teh Tarik 12000",                  "Teh Tarik 12000"),                  # ✅
    ("F21", "Es Matcha Red Bean 22000",         "Es Matcha Red Bean 22000"),         # ✅
    ("F22", "Sandwich Ayam 20000",              "Sandwlch Ayam 20000"),              # ⚠️ "Sandwlch"
    ("F23", "Vanilla Latte 20000",              "Vanilla Latte 20000"),              # ✅
    ("F24", "Es Jeruk 10000",                   "Es Jeruk 10000"),                   # ✅
    ("F25", "Pancake Madu 18000",               "Pancake Madu 18000"),               # ✅
    ("F26", "Espresso Shot 14000",              "Espresso Shot 14000"),              # ✅
    ("F27", "Mie Goreng Spesial 23000",         "Mle Goreng Spesial 23000"),         # ⚠️ "Mle"
    ("F28", "Coklat Panas 16000",               "Coklat Panas 16000"),               # ✅
    ("F29", "Mixed Juice 18000",                "Mixed Juice 18000"),                # ✅
    ("F30", "Brownies Kukus 14000",             "Brownies Kukus 14000"),             # ✅
]

# ─────────────────────────────────────────────
# HITUNG WER & CER PER ITEM
# ─────────────────────────────────────────────

rows = []
for foto_id, truth, ocr_result in data_ocr:
    item_wer = wer(truth, ocr_result)
    item_cer = cer(truth, ocr_result)
    rows.append({
        "Foto": foto_id,
        "Ground Truth": truth,
        "Hasil OCR": ocr_result,
        "WER": round(item_wer, 4),
        "CER": round(item_cer, 4),
        "WER (%)": f"{item_wer*100:.1f}%",
        "CER (%)": f"{item_cer*100:.1f}%",
        "Akurasi Kata (%)": f"{(1-item_wer)*100:.1f}%",
    })

df_ocr = pd.DataFrame(rows)

# ─────────────────────────────────────────────
# RATA-RATA KESELURUHAN
# ─────────────────────────────────────────────

all_truth  = [r[1] for r in data_ocr]
all_ocr    = [r[2] for r in data_ocr]
avg_wer    = wer(all_truth, all_ocr)
avg_cer    = cer(all_truth, all_ocr)
avg_acc    = (1 - avg_wer) * 100

print("="*55)
print("  HASIL UJI AKURASI OCR")
print("="*55)
print(df_ocr[["Foto","WER (%)","CER (%)","Akurasi Kata (%)"]].to_string(index=False))
print(f"\n  Rata-rata WER : {avg_wer*100:.2f}%")
print(f"  Rata-rata CER : {avg_cer*100:.2f}%")
print(f"  Akurasi OCR   : {avg_acc:.2f}%")
print("="*55)

# Simpan ke Excel
df_ocr.to_excel("hasil_uji_ocr.xlsx", index=False)
print("[OK] Disimpan: hasil_uji_ocr.xlsx")
