#!/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
Sử dụng thuật toán so sánh thông minh hơn
"""

import re
from difflib import SequenceMatcher

def extract_myanmar_text(text):
    """Trích xuất chỉ văn bản tiếng Myanmar (Unicode range U+1000-U+109F)"""
    myanmar_pattern = re.compile(r'[\u1000-\u109F၊။\s]+')
    matches = myanmar_pattern.findall(text)
    result = ''.join(matches)
    result = re.sub(r'\s+', ' ', result).strip()
    return result

def normalize_for_comparison(text):
    """Chuẩn hóa văn bản để so sánh: bỏ khoảng trắng"""
    return text.replace(' ', '')

def find_differences(standard, extracted):
    """Tìm sự khác biệt sử dụng SequenceMatcher"""
    matcher = SequenceMatcher(None, standard, extracted)
    
    differences = []
    for tag, i1, i2, j1, j2 in matcher.get_opcodes():
        if tag == 'replace':
            differences.append({
                'type': 'replace',
                'std_pos': (i1, i2),
                'ext_pos': (j1, j2),
                'std_text': standard[i1:i2],
                'ext_text': extracted[j1:j2]
            })
        elif tag == 'delete':
            differences.append({
                'type': 'delete',
                'std_pos': (i1, i2),
                'std_text': standard[i1:i2]
            })
        elif tag == 'insert':
            differences.append({
                'type': 'insert',
                'ext_pos': (j1, j2),
                'ext_text': extracted[j1:j2]
            })
    
    return differences

def calculate_accuracy(standard, extracted):
    """Tính độ chính xác sử dụng ratio của SequenceMatcher"""
    matcher = SequenceMatcher(None, standard, extracted)
    return matcher.ratio() * 100

def categorize_myanmar_errors(differences):
    """Phân loại lỗi Myanmar cụ thể"""
    categories = {
        'confusable_chars': [],  # ဖ/ဘ, ပ/န, ျ/ြ, etc.
        'missing_final': [],     # Mất phụ âm đuôi (်, ံ, င်, etc.)
        'vowel_errors': [],      # Sai nguyên âm (ာ/ေ, etc.)
        'tone_errors': [],       # Sai dấu (့/း/်)
        'word_errors': [],       # Sai từ hoàn toàn
        'punctuation': [],       # Sai dấu câu
    }
    
    # Các cặp ký tự dễ nhầm
    confusable_pairs = [
        ('ဖ', 'ဘ'), ('ဘ', 'ဖ'),
        ('ပ', 'န'), ('န', 'ပ'),
        ('ျ', 'ြ'), ('ြ', 'ျ'),
        ('ထ', 'ဌ'), ('ဌ', 'ထ'),
        ('ာ', 'ေ'), ('ေ', 'ာ'),
        ('ံ', 'မ်'), ('မ်', 'ံ'),
        ('သြ', 'ဩ'), ('ဩ', 'သြ'),
        ('ယ့်', 'ဲ့'), ('ဲ့', 'ယ့်'),
        ('ဝ', '၀'), ('၀', 'ဝ'),
    ]
    
    for diff in differences:
        if diff['type'] == 'replace':
            std = diff['std_text']
            ext = diff['ext_text']
            
            # Kiểm tra dấu câu
            if '၊' in std or '။' in std or '၊' in ext or '။' in ext:
                categories['punctuation'].append(diff)
            # Kiểm tra cặp ký tự dễ nhầm (độ dài 1)
            elif len(std) == 1 and len(ext) == 1:
                is_confusable = any(
                    (std == pair[0] and ext == pair[1]) or 
                    (std == pair[1] and ext == pair[0])
                    for pair in confusable_pairs
                )
                if is_confusable:
                    categories['confusable_chars'].append(diff)
                # Kiểm tra dấu
                elif std in '့း်ံ' or ext in '့း်ံ':
                    categories['tone_errors'].append(diff)
                elif std in 'ာေိီုူ' or ext in 'ာေိီုူ':
                    categories['vowel_errors'].append(diff)
                else:
                    categories['word_errors'].append(diff)
            else:
                # Độ dài > 1: có thể là từ hoặc cụm từ
                if len(std) > len(ext):
                    categories['missing_final'].append(diff)
                else:
                    categories['word_errors'].append(diff)
        elif diff['type'] == 'delete':
            categories['missing_final'].append(diff)
        elif diff['type'] == 'insert':
            categories['word_errors'].append(diff)
    
    return categories

def main():
    # Đọc file
    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()
    
    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 văn bản Myanmar
    standard_myanmar = extract_myanmar_text(standard_text)
    extracted_myanmar = extract_myanmar_text(extracted_text)
    
    # Chuẩn hóa
    std_normalized = normalize_for_comparison(standard_myanmar)
    ext_normalized = normalize_for_comparison(extracted_myanmar)
    
    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(std_normalized)} ký tự (sau khi loại khoảng trắng)")
    print(f"   - Bản trích xuất: {len(ext_normalized)} ký tự (sau khi loại khoảng trắng)")
    print(f"   - Chênh lệch: {abs(len(std_normalized) - len(ext_normalized))} ký tự")
    
    # Tính độ chính xác
    accuracy = calculate_accuracy(std_normalized, ext_normalized)
    
    print(f"\n✅ ĐỘ CHÍNH XÁC TỔNG THỂ: {accuracy:.2f}%")
    
    # Tìm sự khác biệt
    differences = find_differences(std_normalized, ext_normalized)
    print(f"   - Tổng số điểm khác biệt: {len(differences)}")
    
    # Phân loại lỗi
    categories = categorize_myanmar_errors(differences)
    
    print(f"\n📋 PHÂN LOẠI LỖI:")
    print(f"   - Nhầm ký tự dễ nhầm (ဖ/ဘ, ပ/န, ျ/ြ...): {len(categories['confusable_chars'])} lỗi")
    print(f"   - Thiếu phụ âm đuôi/dấu: {len(categories['missing_final'])} lỗi")
    print(f"   - Sai nguyên âm (ာ/ေ...): {len(categories['vowel_errors'])} lỗi")
    print(f"   - Sai dấu thanh (့/း/်): {len(categories['tone_errors'])} lỗi")
    print(f"   - Sai từ/cụm từ: {len(categories['word_errors'])} lỗi")
    print(f"   - Sai dấu câu (၊/။): {len(categories['punctuation'])} lỗi")
    
    # Hiển thị lỗi tiêu biểu
    print(f"\n🔍 LỖI TIÊU BIỂU:")
    
    if categories['confusable_chars']:
        print("\n   ❌ NHẦM KÝ TỰ DỄ NHẦM:")
        shown = set()
        for err in categories['confusable_chars'][:10]:
            key = f"{err['std_text']}→{err['ext_text']}"
            if key not in shown:
                shown.add(key)
                print(f"      '{err['std_text']}' → '{err['ext_text']}'")
    
    if categories['word_errors']:
        print("\n   📝 SAI TỪ/CỤM TỪ:")
        shown = set()
        for err in categories['word_errors'][:10]:
            if err['type'] == 'replace':
                key = f"{err['std_text']}→{err['ext_text']}"
                if key not in shown and len(err['std_text']) <= 10:
                    shown.add(key)
                    print(f"      '{err['std_text']}' → '{err['ext_text']}'")
    
    if categories['missing_final']:
        print("\n   ⚠️ THIẾU KÝ TỰ:")
        for err in categories['missing_final'][:5]:
            if err['type'] == 'delete':
                print(f"      Thiếu: '{err['std_text']}'")
            elif err['type'] == 'replace' and len(err['std_text']) > len(err['ext_text']):
                print(f"      '{err['std_text']}' → '{err['ext_text']}' (mất {len(err['std_text'])-len(err['ext_text'])} ký tự)")
    
    # So sánh đoạn đầu
    print(f"\n📄 SO SÁNH ĐOẠN ĐẦU:")
    print(f"   Bản chuẩn (100 ký tự đầu):")
    print(f"      {std_normalized[:100]}...")
    print(f"   Bản trích xuất (100 ký tự đầu):")
    print(f"      {ext_normalized[:100]}...")
    
    print("\n" + "=" * 80)
    print("KẾT LUẬN:")
    if accuracy >= 95:
        print(f"   🎉 Xuất sắc! Độ chính xác {accuracy:.2f}%")
    elif accuracy >= 90:
        print(f"   ✅ Tốt! Độ chính xác {accuracy:.2f}%")
    elif accuracy >= 80:
        print(f"   ⚠️ Khá! Độ chính xác {accuracy:.2f}% - Cần hiệu chỉnh")
    else:
        print(f"   ❌ Độ chính xác {accuracy:.2f}% - Cần cải thiện nhiều")
    print("=" * 80)

if __name__ == '__main__':
    main()
