import re
from Sastrawi.Stemmer.StemmerFactory import StemmerFactory

# ==============================================================================
# INISIALISASI SASTRAWI STEMMER
# ==============================================================================
# Penjelasan Sidang:
# Sastrawi adalah pustaka NLP populer untuk Bahasa Indonesia yang mengimplementasikan
# Algoritma Nazief & Adriani untuk menemukan kata dasar secara akurat.
# Inisialisasi dilakukan sekali di luar fungsi agar performa API tetap cepat.
# ==============================================================================
print("Menginisialisasi Sastrawi Stemmer...")
factory = StemmerFactory()
stemmer = factory.create_stemmer()

# ==============================================================================
# DAFTAR STOPWORDS BAHASA INDONESIA
# ==============================================================================
# Penjelasan Sidang:
# Stopwords adalah kata umum yang memiliki frekuensi tinggi tetapi tidak membawa
# informasi kontekstual yang signifikan untuk membedakan kategori pengaduan.
# ==============================================================================
STOPWORDS = set([
    'dan', 'di', 'yang', 'saya', 'adalah', 'untuk', 'pada', 'ke', 'ini', 'itu', 
    'dengan', 'ada', 'dari', 'akan', 'bisa', 'kami', 'mereka', 'oleh', 'karena', 
    'jika', 'atau', 'saja', 'tersebut', 'dia', 'sudah', 'telah', 'dalam', 
    'tentang', 'bahwa', 'bagi', 'seperti', 'sangat', 'banyak', 'beberapa', 
    'maka', 'namun', 'juga', 'tetapi', 'olehnya', 'pun', 'lah', 'kah', 'tapi',
    'yang', 'untuk', 'pada', 'ke', 'para', 'namun', 'serta'
])

# ==============================================================================
# FUNGSI PRAPEMROSESAN TEKS (TEXT PREPROCESSING)
# ==============================================================================
# Penjelasan Sidang:
# Fungsi ini membersihkan teks kotor dari pengguna menjadi kata dasar bersih
# agar model Naive Bayes dapat menghitung probabilitas kata dengan akurat.
# ==============================================================================
def preprocess_text(text):
    if not text:
        return ""
    
    # 1. CASE FOLDING
    # Mengubah semua huruf menjadi huruf kecil agar "Jalan" dan "jalan" dianggap sama.
    text = text.lower()
    
    # 2. CLEANSING (Pembersihan Kebisingan/Noise)
    # Menggunakan Regular Expression (regex) untuk mengganti angka, tanda baca,
    # dan karakter non-alfabet menjadi spasi kosong.
    text = re.sub(r'[^a-zA-Z\s]', ' ', text)
    
    # 3. TOKENIZATION & STOPWORDS REMOVAL
    # - Tokenisasi: Memotong string teks menjadi list kata tunggal menggunakan spasi.
    # - Stopword Removal: Menyaring kata-kata yang termasuk dalam daftar STOPWORDS
    #   dan kata yang panjangnya kurang dari atau sama dengan 2 karakter (menghindari
    #   kata kosong atau singkatan yang tidak berguna).
    tokens = text.split()
    filtered_tokens = [token for token in tokens if token not in STOPWORDS and len(token) > 2]
    
    # 4. STEMMING
    # Menggabungkan kembali token kata bersih dengan spasi, lalu memanggil
    # Sastrawi Stemmer untuk memetakan kata berimbuhan (misal: "diperbaiki", "perbaikan")
    # kembali ke kata dasarnya ("baik").
    clean_text = " ".join(filtered_tokens)
    stemmed_text = stemmer.stem(clean_text)
    
    return stemmed_text
