#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""So sánh bản OCR với bản chuẩn Tam-Bao-206-210"""

import re

def read_file(path):
    with open(path, 'r', encoding='utf-8') as f:
        return f.read()

def normalize_text(text):
    """Chuẩn hóa văn bản để so sánh - giữ nguyên văn tuyệt đối"""
    # Chỉ loại bỏ khoảng trắng thừa và newline khác biệt
    text = re.sub(r'\s+', ' ', text)
    return text.strip()

def find_errors(standard, ocr):
    """Tìm lỗi giữa bản chuẩn và OCR"""
    errors = []
    
    # Các lỗi phổ biến cần tìm
    error_patterns = [
        # Số bị nhận sai
        (r'၁၈', r'၁ဂ', 'Số ၁၈ → ၁ဂ'),
        (r'၂၈', r'၂ဂ', 'Số ၂၈ → ၂ဂ'),
        (r'၃၈', r'၃ဂ', 'Số ၃၈ → ၃ဂ'),
        (r'၅၀', r'၅ဝ', 'Số ၅၀ → ၅ဝ'),
        (r'၆၈', r'၆ဂ', 'Số ၆၈ → ၆ဂ'),
        (r'၇၈', r'၇ဂ', 'Số ၇၈ → ၇ဂ'),
        (r'၈၀', r'ဂ၀', 'Số ၈၀ → ဂ၀ (nghiêm trọng)'),
        
        # Tên riêng Pali sai
        (r'တောစာရုဇာဏုမန္တတာ', r'တော စာရုဇာဏု မဏ္ဍလတာ', 'Tên Pali: တောစာရုဇာဏုမန္တတာ'),
        (r'ပုရိသဗျဉ္ဇနတာ', r'ပုရှိသဗျဉ္စနတာ', 'Tên Pali: ပုရိသဗျဉ္ဇနတာ'),
        (r'ဒွိရဒကရသဒိသ', r'ဒွိရဒကၡသဒိသ', 'Tên Pali: ဒွိရဒကရသဒိသ'),
        (r'အာဠာဝက', r'ကာဠာဝက', 'Tên riêng: အာဠာဝက → ကာဠာဝက (nghiêm trọng)'),
        
        # Từ vựng sai
        (r'ဝေဖန်', r'ဝေဘန်', 'Từ: ဝေဖန် → ဝေဘန်'),
        (r'ပထမ', r'ပဌမ', 'Từ: ပထမ → ပဌမ'),
        (r'ဦးခေါင်း', r'ဥုးခေါင်း', 'Từ: ဦးခေါင်း → ဥုးခေါင်း (nghiêm trọng)'),
        (r'မျက်ခုံး', r'မျက်ခုန်း', 'Từ: မျက်ခုံး → မျက်ခုန်း'),
        (r'မွေးညင်း', r'မွေးညှင်း', 'Từ: မွေးညင်း → မွေးညှင်း'),
        (r'လက်ယာရစ်', r'လက်ျာရစ်', 'Từ: လက်ယာရစ် → လက်ျာရစ်'),
        
        # Thiếu dấu '့'
        (r'သို့', r'သို', 'Thiếu dấu ့: သို့ → သို'),
        (r'တစ်ပါး', r'တပါး', 'Thiếu ့: တစ်ပါး → တပါး'),
        
        # Số trang sai
        (r'၄၃၃', r'၄၀၁', 'Số trang: ၄၃၃ → ၄၀၁'),
    ]
    
    return errors

def count_char_errors(standard, ocr):
    """Đếm lỗi ký tự"""
    # Loại bỏ whitespace để đếm ký tự
    std_chars = re.sub(r'\s', '', standard)
    ocr_chars = re.sub(r'\s', '', ocr)
    
    # Đếm ký tự khớp
    matches = 0
    total = max(len(std_chars), len(ocr_chars))
    
    for i in range(min(len(std_chars), len(ocr_chars))):
        if std_chars[i] == ocr_chars[i]:
            matches += 1
    
    return matches, total, (matches / total * 100) if total > 0 else 0

def main():
    standard = read_file('An Duc Tam Bao/pdf/Tam-Bao-206-210-standard.txt')
    ocr = read_file('An Duc Tam Bao/output/Tam-Bao-206-210-qwen.md')
    
    print("=" * 70)
    print("ĐÁNH GIÁ ĐỘ CHÍNH XÁC BATCH TAM-BAO-206-210")
    print("=" * 70)
    
    # Đếm ký tự
    matches, total, accuracy = count_char_errors(standard, ocr)
    print(f"\n📊 Thống kê cơ bản:")
    print(f"   - Ký tự bản chuẩn: {len(re.sub(r'\\s', '', standard))}")
    print(f"   - Ký tự bản OCR: {len(re.sub(r'\\s', '', ocr))}")
    print(f"   - Ký tự khớp: {matches}/{total}")
    print(f"   - Độ chính xác ký tự: {accuracy:.2f}%")
    
    # Tìm và liệt kê lỗi cụ thể
    print(f"\n🔍 Các lỗi phát hiện:")
    print("-" * 70)
    
    error_count = 0
    
    # Kiểm tra số bị sai
    numbers_wrong = [
        ('၁၈', '၁ဂ'), ('၂၈', '၂ဂ'), ('၃၈', '၃ဂ'),
        ('၅၀', '၅ဝ'), ('၆၈', '၆ဂ'), ('၇၈', '၇ဂ'), ('၈၀', 'ဂ၀')
    ]
    for correct, wrong in numbers_wrong:
        if wrong in ocr:
            print(f"   ❌ Số: {correct} → {wrong}")
            error_count += 1
    
    # Kiểm tra tên riêng Pali
    pali_errors = [
        ('တောစာရုဇာဏုမန္တတာ', 'တော စာရုဇာဏု မဏ္ဍလတာ'),
        ('ပုရိသဗျဉ္ဇနတာ', 'ပုရှိသဗျဉ္စနတာ'),
        ('ဒွိရဒကရသဒိသ', 'ဒွိရဒကၡသဒိသ'),
        ('အာဠာဝက', 'ကာဠာဝက'),
    ]
    for correct, wrong in pali_errors:
        if correct in standard and wrong in ocr:
            print(f"   ❌ Tên Pali: {correct} → {wrong}")
            error_count += 1
        elif correct in standard and correct not in ocr:
            print(f"   ❌ Tên Pali thiếu: {correct}")
            error_count += 1
    
    # Kiểm tra từ vựng
    vocab_errors = [
        ('ဝေဖန်', 'ဝေဘန်'),
        ('ပထမ', 'ပဌမ'),
        ('ဦးခေါင်း', 'ဥုးခေါင်း'),
        ('မျက်ခုံး', 'မျက်ခုန်း'),
        ('မွေးညင်း', 'မွေးညှင်း'),
        ('လက်ယာရစ်', 'လက်ျာရစ်'),
    ]
    for correct, wrong in vocab_errors:
        count_wrong = ocr.count(wrong)
        if count_wrong > 0:
            print(f"   ❌ Từ vựng: {correct} → {wrong} ({count_wrong} lần)")
            error_count += 1
    
    # Kiểm tra thiếu dấu
    if ocr.count('သို') > standard.count('သို'):
        print(f"   ❌ Thiếu dấu ့: သို့ → သို ({ocr.count('သို') - standard.count('သို')} lần)")
        error_count += 1
    
    if ocr.count('တပါး') > standard.count('တပါး'):
        print(f"   ❌ Thiếu ့: တစ်ပါး → တပါး")
        error_count += 1
    
    # Số trang sai
    if '၄၀၁' in ocr and '၄၃၃' in standard:
        print(f"   ❌ Số trang: ၄၃၃ → ၄၀၁")
        error_count += 1
    
    print(f"\n📝 Tổng số loại lỗi: {error_count}")
    
    # Đánh giá chung
    print(f"\n📈 ĐÁNH GIÁ CHUNG:")
    print("-" * 70)
    if accuracy >= 92:
        print(f"   ✅ Xuất sắc: {accuracy:.2f}% - Batch tốt nhất từ trước đến nay!")
    elif accuracy >= 90:
        print(f"   ✅ Tốt: {accuracy:.2f}% - Đạt yêu cầu, cao hơn trung bình")
    elif accuracy >= 88:
        print(f"   ⚠️  Đạt: {accuracy:.2f}% - Chấp nhận được")
    elif accuracy >= 85:
        print(f"   ⚠️  Trung bình: {accuracy:.2f}% - Cần cải thiện")
    else:
        print(f"   ❌ Thấp: {accuracy:.2f}% - Cần xem xét lại OCR")
    
    print("\n" + "=" * 70)

if __name__ == '__main__':
    main()
