#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
Script so sánh độ chính xác giữa bản trích xuất và bản chuẩn
Chỉ tập trung vào văn bản tiếng Myanmar, bỏ qua formatting
"""

import re

def extract_myanmar_text(text):
    """Trích xuất chỉ văn bản tiếng Myanmar (Unicode range U+1000-U+109F)"""
    # Giữ lại ký tự Myanmar, dấu câu Myanmar (၊။), và số Myanmar
    myanmar_pattern = re.compile(r'[\u1000-\u109F၊။\s]+')
    matches = myanmar_pattern.findall(text)
    result = ''.join(matches)
    
    # Chuẩn hóa: bỏ khoảng trắng thừa, xuống dòng
    result = re.sub(r'\s+', ' ', result).strip()
    return result

def calculate_accuracy(standard, extracted):
    """Tính độ chính xác bằng cách so sánh từng ký tự"""
    # Loại bỏ khoảng trắng để so sánh chính xác hơn
    std_chars = standard.replace(' ', '')
    ext_chars = extracted.replace(' ', '')
    
    # Đếm tổng số ký tự chuẩn
    total_std = len(std_chars)
    
    # Tìm các lỗi
    errors = []
    min_len = min(len(std_chars), len(ext_chars))
    
    # So sánh từng ký tự
    for i in range(min_len):
        if std_chars[i] != ext_chars[i]:
            errors.append({
                'position': i,
                'expected': std_chars[i],
                'actual': ext_chars[i],
                'context': std_chars[max(0,i-10):i+11]
            })
    
    # Thêm các ký tự bị thiếu hoặc thừa
    if len(ext_chars) < len(std_chars):
        for i in range(min_len, len(std_chars)):
            errors.append({
                'position': i,
                'expected': std_chars[i],
                'actual': '(missing)',
                'type': 'missing',
                'context': std_chars[max(0,i-10):i+11]
            })
    elif len(ext_chars) > len(std_chars):
        for i in range(min_len, len(ext_chars)):
            errors.append({
                'position': i,
                'expected': '(none)',
                'actual': ext_chars[i],
                'type': 'extra',
                'context': ext_chars[max(0,i-10):i+11]
            })
    
    # Tính độ chính xác
    correct_chars = len(std_chars) - len([e for e in errors if e.get('type') != 'extra'])
    accuracy = (correct_chars / total_std * 100) if total_std > 0 else 0
    
    return accuracy, errors, total_std

def categorize_errors(errors):
    """Phân loại lỗi"""
    categories = {
        'wrong_char': [],      # Nhầm ký tự (ဖ vs ဘ, ပ vs န, etc.)
        'missing_char': [],    # Thiếu ký tự (မất dấu, mất phụ âm đuôi)
        'extra_char': [],      # Thừa ký tự
        'wrong_word': [],      # Sai từ
        'punctuation': [],     # Sai dấu câu
    }
    
    for error in errors:
        if error.get('type') == 'missing':
            categories['missing_char'].append(error)
        elif error.get('type') == 'extra':
            categories['extra_char'].append(error)
        elif error['expected'] in '၊။' or error['actual'] in '၊။':
            categories['punctuation'].append(error)
        elif error['expected'] != error['actual'] and len(error['expected']) == 1 and len(error['actual']) == 1:
            categories['wrong_char'].append(error)
        else:
            categories['wrong_word'].append(error)
    
    return categories

def main():
    # Đọc file chuẩn
    with open('/opt/openclaw/.openclaw/workspace/An Duc Tam Bao/tam_bao_91_95_chuan_muc_standard.txt', 'r', encoding='utf-8') as f:
        standard_text = f.read()
    
    # Đọc file trích xuất
    with open('/opt/openclaw/.openclaw/workspace/An Duc Tam Bao/tam_bao_91_95_chuan_muc.md', 'r', encoding='utf-8') as f:
        extracted_text = f.read()
    
    # Trích xuất chỉ văn bản Myanmar
    standard_myanmar = extract_myanmar_text(standard_text)
    extracted_myanmar = extract_myanmar_text(extracted_text)
    
    print("=" * 80)
    print("PHÂN TÍCH ĐỘ CHÍNH XÁC VĂN BẢN MYANMAR")
    print("=" * 80)
    print(f"\n📊 Thống kê tổng quát:")
    print(f"   - Bản chuẩn: {len(standard_myanmar.replace(' ', ''))} ký tự Myanmar")
    print(f"   - Bản trích xuất: {len(extracted_myanmar.replace(' ', ''))} ký tự Myanmar")
    
    # Tính độ chính xác
    accuracy, errors, total_chars = calculate_accuracy(standard_myanmar, extracted_myanmar)
    
    print(f"\n✅ ĐỘ CHÍNH XÁC: {accuracy:.2f}%")
    print(f"   - Số lỗi phát hiện: {len(errors)}")
    print(f"   - Tổng ký tự so sánh: {total_chars}")
    
    # Phân loại lỗi
    categories = categorize_errors(errors[:100])  # Giới hạn 100 lỗi đầu để phân tích
    
    print(f"\n📋 Phân loại lỗi (trong {min(100, len(errors))} lỗi đầu tiên):")
    print(f"   - Nhầm ký tự: {len(categories['wrong_char'])} lỗi")
    print(f"   - Thiếu ký tự: {len(categories['missing_char'])} lỗi")
    print(f"   - Thừa ký tự: {len(categories['extra_char'])} lỗi")
    print(f"   - Sai dấu câu: {len(categories['punctuation'])} lỗi")
    print(f"   - Sai từ: {len(categories['wrong_word'])} lỗi")
    
    # Hiển thị một số lỗi tiêu biểu
    print(f"\n🔍 Một số lỗi tiêu biểu:")
    
    # Lỗi nhầm ký tự phổ biến
    wrong_char_samples = categories['wrong_char'][:15]
    if wrong_char_samples:
        print("\n   ❌ NHẦM KÝ TỰ:")
        for err in wrong_char_samples:
            print(f"      Vị trí {err['position']}: '{err['expected']}' → '{err['actual']}'")
            print(f"         Ngữ cảnh: ...{err['context']}...")
    
    # Lỗi thiếu ký tự
    missing_samples = categories['missing_char'][:10]
    if missing_samples:
        print("\n   ⚠️ THIẾU KÝ TỰ:")
        for err in missing_samples[:5]:
            print(f"      Vị trí {err['position']}: thiếu '{err['expected']}'")
            print(f"         Ngữ cảnh: ...{err['context']}...")
    
    # Lỗi sai từ quan trọng
    important_errors = []
    for err in errors[:50]:
        if err.get('type') not in ['missing', 'extra']:
            if err['expected'] != err['actual']:
                important_errors.append(err)
    
    if important_errors:
        print("\n   📝 SAI TỪ/CỤM TỪ QUAN TRỌNG:")
        shown = set()
        for err in important_errors[:10]:
            key = f"{err['expected']}→{err['actual']}"
            if key not in shown:
                shown.add(key)
                print(f"      '{err['expected']}' → '{err['actual']}' (vị trí {err['position']})")
    
    print("\n" + "=" * 80)
    print("KẾT LUẬN:")
    if accuracy >= 95:
        print(f"   🎉 Xuất sắc! Độ chính xác {accuracy:.2f}% - Rất đáng tin cậy")
    elif accuracy >= 90:
        print(f"   ✅ Tốt! Độ chính xác {accuracy:.2f}% - Có thể sử dụng được")
    elif accuracy >= 80:
        print(f"   ⚠️ Khá! Độ chính xác {accuracy:.2f}% - Cần hiệu chỉnh thêm")
    else:
        print(f"   ❌ Cần cải thiện! Độ chính xác {accuracy:.2f}% - Nhiều lỗi cần sửa")
    print("=" * 80)

if __name__ == '__main__':
    main()
