import re
from difflib import get_close_matches

def naturalisasi_aturan(list_kata):
    if not list_kata:
        return []

    # --- DATABASE NAMA (Hanya digunakan jika konteksnya benar) ---
    db_nama = [
        "muhammad", "mohammad", "ahmad", 
        "aldi", "aldy", "alfatih",
        "annisa", "anisa", "nur", "nurul",
        "putri", "putra", "siti", "dewi", "dwi", "tri",
        "budi", "eko", "agus", "joko", "sri",
        "sallman", "salman", "fadhil", "fadli",
        "zahra", "azzahra", "fatimah",
        "rizki", "rizky", "fajar", "ilham",
        "yusuf", "yosep", "kevin", "michael",
        "dedi", "eka", "fifi", "gigi", "hadi", "ina", "kiki",
        "lili", "mimi", "nina", "sisi", "titi", "vivi", "yaya", "zaza",
        "lika", "cici"
    ]
    
    # Urutkan DB berdasarkan panjang (terpanjang dicek duluan untuk split)
    db_nama_sorted = sorted(db_nama, key=len, reverse=True)

    def auto_correct_fuzzy(kata_input):
        # Hanya koreksi jika kemiripannya SANGAT tinggi (0.9) agar tidak merusak kata lain
        kata_input = kata_input.lower()
        if kata_input in db_nama: return kata_input
        matches = get_close_matches(kata_input, db_nama, n=1, cutoff=0.9) 
        return matches[0] if matches else kata_input

    # --- LANGKAH 1: NER & EJAAN JARI ---
    list_ner = []
    
    # 1. Gabungkan Ejaan Jari (M U H A M M A D -> MUHAMMAD)
    list_gabungan = []
    buffer_ejaan = ""
    
    for kata in list_kata:
        # Anggap 1 huruf adalah ejaan jari
        if len(kata) == 1 and kata.isalpha():
            buffer_ejaan += kata
        else:
            if buffer_ejaan:
                ejaan_lower = buffer_ejaan.lower()
                
                # Cek apakah ejaan jari ini adalah nama yang dikenal
                if ejaan_lower in db_nama or auto_correct_fuzzy(ejaan_lower) in db_nama:
                    # Nama dikenali, gunakan koreksi dari database
                    nama_koreksi = auto_correct_fuzzy(ejaan_lower)
                    list_gabungan.append(f"__NAME__{nama_koreksi}")
                elif len(buffer_ejaan) >= 3:
                    # EJAAN JARI >= 3 HURUF: Asumsikan ini NAMA meski tidak di database
                    # Contoh: S T E P -> Step (dengan kapital)
                    list_gabungan.append(f"__NAME__{ejaan_lower}")
                else:
                    # Ejaan pendek (1-2 huruf), biarkan apa adanya
                    list_gabungan.append(buffer_ejaan)
                buffer_ejaan = ""
            list_gabungan.append(kata)
    
    # Handle buffer terakhir
    if buffer_ejaan:
        ejaan_lower = buffer_ejaan.lower()
        if ejaan_lower in db_nama or auto_correct_fuzzy(ejaan_lower) in db_nama:
            nama_koreksi = auto_correct_fuzzy(ejaan_lower)
            list_gabungan.append(f"__NAME__{nama_koreksi}")
        elif len(buffer_ejaan) >= 3:
            # Ejaan jari >= 3 huruf, asumsikan nama
            list_gabungan.append(f"__NAME__{ejaan_lower}")
        else:
            list_gabungan.append(buffer_ejaan)
    
    # 2. LOGIKA "SMART SPLIT" & "TAGGING" (YANG SUDAH DIPERBAIKI)
    bukan_nama = ["saya", "kamu", "dia", "mereka", "kita", "kami", "anda", "itu", "ini"]
    
    for i, kata in enumerate(list_gabungan):
        # Cek kata sebelumnya
        prev_word = list_gabungan[i-1].lower() if i > 0 else ""
        
        # JIKA kata sebelumnya "NAMA" -> Baru kita jalankan logika berat (Split/Correct)
        if prev_word == "nama" and kata.lower() not in bukan_nama:
            
            # --- LOGIKA SPLIT (Hanya jalan di sini) ---
            kata_processed = []
            split_berhasil = False
            kata_lower = kata.lower()
            
            # Cek Split
            for nama_db in db_nama_sorted:
                if kata_lower.startswith(nama_db):
                    sisa = kata_lower[len(nama_db):]
                    if len(sisa) >= 3:
                        part1 = auto_correct_fuzzy(nama_db)
                        part2 = auto_correct_fuzzy(sisa)
                        # Tambahkan tag __NAME__ langsung
                        kata_processed.append(f"__NAME__{part1}")
                        kata_processed.append(f"__NAME__{part2}")
                        split_berhasil = True
                        break
            
            if not split_berhasil:
                # Jika tidak split, cuma autocorrect biasa
                koreksi = auto_correct_fuzzy(kata_lower)
                kata_processed.append(f"__NAME__{koreksi}")
            
            # Masukkan hasil proses ke list utama
            list_ner.extend(kata_processed)
            
        else:
            # JIKA BUKAN NAMA -> Biarkan apa adanya! (JANGAN DI UTAK-ATIK)
            # Ini yang menyelamatkan 'MAKAN', 'BELAJAR', 'TIDUR'
            list_ner.append(kata)

    # --- LANGKAH 2: KAMUS PENGGANTI ---
    kamus_ganti = {
        "dimana-kemana": "di mana", 
        "dimana-kemana": "ke mana",    
        "mengapa-kenapa": "mengapa",
        "mengapa-kenapa": "kenapa",
        
        # Fix ID 102
        "bagaimana belajar": "bagaimana cara belajar", 
        "apa kabar": "apa kabar",
        
        "selamat pagi": "selamat_pagi",
        "selamat siang": "selamat_siang",
        "selamat malam": "selamat_malam",
        "terima kasih": "terima_kasih",
        "mau": "ingin",
        "makasih": "terima kasih",
        "nggak": "tidak",
        "ndak": "tidak",
        "senang-gembira": "merasa senang",
        "senang-gembira": "gembira",
        "senang-gembira": "senang",
        "sedih": "merasa sedih",
        "bingung": "merasa bingung"
    }
    
    hasil_tahap_2 = []
    i = 0
    while i < len(list_ner):
        kata = list_ner[i]
        kata_clean = re.sub(r'__name__', '', kata, flags=re.IGNORECASE)
        
        # Cek Frasa 2 kata
        if i < len(list_ner) - 1:
            next_kata = list_ner[i+1]
            next_clean = re.sub(r'__name__', '', next_kata, flags=re.IGNORECASE)
            bigram = f"{kata_clean.lower()} {next_clean.lower()}"
            
            if bigram in kamus_ganti:
                hasil_tahap_2.extend(kamus_ganti[bigram].split()) 
                i += 2
                continue
        
        # Cek Kata Tunggal
        if kata_clean.lower() in kamus_ganti:
            pengganti = kamus_ganti[kata_clean.lower()].split()
            hasil_tahap_2.extend(pengganti)
        else:
            hasil_tahap_2.append(kata)
        i += 1

    # --- LANGKAH 3: STRUKTUR TANYA ---
    kata_gerak = ["pergi", "jalan", "lari", "pulang", "berangkat", "mudik", "terbang", "antar", "ikut"]
    kata_asal  = ["asal", "datang", "kembali"] 

    for idx, k in enumerate(hasil_tahap_2):
        k_lower = k.lower()
        prev = hasil_tahap_2[idx-1].lower() if idx > 0 else ""
        
        if k_lower == "di mana":
            if prev in kata_gerak:
                hasil_tahap_2[idx] = "ke mana"
            elif prev in kata_asal:
                hasil_tahap_2[idx] = "dari mana"

    kata_tanya = ["siapa", "apa", "di mana", "kemana", "kapan", "bagaimana", "mengapa", "kenapa"]
    idx_tanya = -1
    for idx, k in enumerate(hasil_tahap_2):
        if k.lower() in kata_tanya or "mana" in k.lower():
            idx_tanya = idx
            break
            
    if idx_tanya > 0:
        tanya = hasil_tahap_2.pop(idx_tanya)
        hasil_tahap_2.insert(0, tanya)

    # --- LANGKAH 4: MORFOLOGI - AWALAN ME-/BER- ---
    # Transformasi kata dasar ke bentuk baku dengan awalan yang benar
    morfologi_me = {
        # Awalan me- (untuk kata kerja transitif)
        "tulis": "menulis",
        "baca": "membaca",
        "dengar": "mendengar",
        "lihat": "melihat",
        "ambil": "mengambil",
        "beli": "membeli",
        "jual": "menjual",
        "buat": "membuat",
        "bawa": "membawa",
        "kirim": "mengirim",
        "terima": "menerima",
        "bantu": "membantu",
        "cari": "mencari",
        "tunggu": "menunggu",
        "tanya": "menanya",
        "jawab": "menjawab",
        "ajar": "mengajar",
        "gambar": "menggambar",
        "lukis": "melukis",
        "masak": "memasak",
        "cuci": "mencuci",
        "sapu": "menyapu",
        "siram": "menyiram",
        "panggil": "memanggil",
        "nyanyi": "menyanyi",
        "tari": "menari",
        "renang": "berenang",
        "lari": "berlari",
        "jalan": "berjalan",
        "main": "bermain",
        "kerja": "bekerja",
        "doa": "berdoa",
        "bicara": "berbicara",
        "nonton": "menonton",
    }
    
    # Transformasi kata dengan morfologi
    hasil_morfologi = []
    for kata in hasil_tahap_2:
        kata_lower = kata.lower()
        if kata_lower in morfologi_me:
            hasil_morfologi.append(morfologi_me[kata_lower])
        else:
            hasil_morfologi.append(kata)
    
    # --- LANGKAH 5: SISIPKAN "SEDANG" UNTUK KATA KERJA AKTIVITAS ---
    # Pola: SUBJEK + VERB → SUBJEK + sedang + VERB
    kata_subjek = ["saya", "aku", "kamu", "dia", "kita", "kami", "mereka", 
                   "ibu", "ayah", "bapak", "kakak", "adik", "nenek", "kakek",
                   "teman", "guru", "murid", "anak"]
    
    kata_kerja_aktivitas = [
        "belajar", "makan", "minum", "tidur", "bermain", "bekerja",
        "membaca", "menulis", "menonton", "mendengar", "berlari",
        "berjalan", "memasak", "mencuci", "menyapu", "duduk", "berdiri",
        "menari", "menyanyi", "berenang", "bersepeda", "berkebun",
        "belanja", "memasak", "menggambar", "melukis", "berdoa",
        "berbicara", "melihat", "mengambil", "membeli", "membuat",
        "membawa", "mengirim", "membantu", "mencari", "menunggu",
        "mengajar", "menyiram", 
    ]
    
    # Temporal markers - jangan tambahkan "sedang" jika sudah ada marker
    temporal_markers = ["sudah", "sedang", "akan", "pernah", "baru", "belum", "masih"]
    
    hasil_akhir = []
    ada_temporal = False
    
    for idx, kata in enumerate(hasil_morfologi):
        kata_lower = kata.lower()
        prev = hasil_morfologi[idx-1].lower() if idx > 0 else ""
        
        # Cek apakah ada temporal marker di kalimat
        if kata_lower in temporal_markers:
            ada_temporal = True
        
        # Cek: kata sebelumnya adalah subjek DAN kata sekarang adalah kata kerja aktivitas
        # DAN belum ada temporal marker
        if (prev in kata_subjek and 
            kata_lower in kata_kerja_aktivitas and
            not ada_temporal):
            # Sisipkan "sedang" sebelum kata kerja
            hasil_akhir.append("sedang")
            ada_temporal = True  # Jangan tambahkan lagi untuk kata kerja berikutnya
        
        hasil_akhir.append(kata)

    return hasil_akhir