#!/usr/bin/env python3
"""Verifikasi seed CF: hitung ulang pakai logika identik mesin CF PHP, bandingkan dengan seed yang dihasilkan."""

import re, json, sys

sys.path.insert(0, 'C:/laragon/www/yuni anak si')
import importlib.util
spec = importlib.util.spec_from_file_location("gs", "C:/laragon/www/yuni anak si/generate_seed.py")
gs = importlib.util.module_from_spec(spec)
spec.loader.exec_module(gs)

# Baca file seed yang dihasilkan
with open('C:/laragon/www/yuni anak si/sql/seed_siswa_52.sql', 'r', encoding='utf-8') as f:
    sql_content = f.read()

# Ekstrak hasil_identifikasi dari seed
hasil_pattern = re.compile(
    r"INSERT INTO hasil_identifikasi.*?VALUES\s*\(([^)]+)\);",
    re.DOTALL
)

# Ekstrak jawaban per konsultasi dari seed
jawaban_per_konsultasi = {}
jawaban_pattern = re.compile(
    r"INSERT INTO jawaban \(konsultasi_id, pernyataan_id, nilai, cf_user\) VALUES\s*\((.*?)\);",
    re.DOTALL
)

for match in jawaban_pattern.finditer(sql_content):
    values_str = match.group(1)
    entries = re.findall(r'\((\d+),\s*(\d+),\s*(\d+),\s*([\d.]+)\)', values_str)
    for konsultasi_id, pernyataan_id, nilai, cf_user in entries:
        konsultasi_id = int(konsultasi_id)
        pernyataan_id = int(pernyataan_id)
        nilai = int(nilai)
        if konsultasi_id not in jawaban_per_konsultasi:
            jawaban_per_konsultasi[konsultasi_id] = {}
        jawaban_per_konsultasi[konsultasi_id][pernyataan_id] = nilai

# Ekstrak hasil_identifikasi
hasil_sql = {}
for match in hasil_pattern.finditer(sql_content):
    values_str = match.group(1)
    # Parse JSON cf_per_gejala
    json_match = re.search(r'"cf_per_gejala":\s*(\{[^}]+\})', values_str) or re.search(r"'cf_per_gejala':\s*'([^']+)'", values_str)
    cf_json = None
    if json_match:
        cf_json_str = json_match.group(1).strip("'\"")
        try:
            cf_json = json.loads(cf_json_str)
        except:
            # Try replacing single quotes
            cf_json = json.loads(cf_json_str.replace("'", '"'))
    
    id_match = re.search(r'(?:id|konsultasi_id|siswa_id)\s*=\s*(\d+)', values_str)
    if not id_match:
        continue
    
    persentase_match = re.search(r'persentase.*?(\d+\.?\d*)', values_str)
    kategori_match = re.search(r",\s*'(rendah|sedang|tinggi)'\s*,", values_str)
    
    # Lebih akurat: parse dengan regex kompleks
    parts = values_str.split(',')
    cf_akhir = None
    persentase = None
    kategori = None
    
    for i, part in enumerate(parts):
        part = part.strip()
        if "'" in part and "Tingkat adiksi" in part:
            kategori = "tinggi" if "TINGGI" in part else ("sedang" if "SEDANG" in part else "rendah")
        elif part.replace('.','').replace('-','').isdigit():
            if cf_akhir is None:
                cf_akhir = float(part)
            elif persentase is None:
                persentase = float(part)
    
    # Ambil konsultasi_id dari sisa parse
    konsultasi_id_match = re.search(r'\((\d+),\s*(\d+),\s*(\d+)', values_str)
    if konsultasi_id_match:
        konsultasi_id = int(konsultasi_id_match.group(2))  # siswa_id sebenarnya tapi kita mapping

print("=" * 70)
print("VERIFIKASI SEED CF — Perbandingan Hasil Seed vs Hitungan Manual")
print("=" * 70)

# Ambil data dari generate_seed.py output (semua_results)
all_results = []
for idx, (kelas, jk, nama, nis) in enumerate(gs.students):
    profile_idx = gs.profile_indices[idx] if idx < len(gs.profile_indices) else 0
    max_gejala, desc = gs.PROFILES[profile_idx]
    cf_gejala, cf_akhir, persentase, kategori = gs.calculate_cf(max_gejala)
    username = f"siswa{idx+2:02d}"
    all_results.append({
        'username': username,
        'nama': nama,
        'kelas': kelas,
        'max_gejala': max_gejala,
        'cf_gejala': cf_gejala,
        'cf_akhir': cf_akhir,
        'persentase': persentase,
        'kategori': kategori
    })

# Bandingkan dengan hitungan manual untuk beberapa sampel
print("\n[SAMPEL VERIFIKASI]")
print("-" * 70)

# Ambil 5 sampel acak
import random
random.seed(123)
sampel_idx = random.sample(range(len(all_results)), min(5, len(all_results)))

for idx in sampel_idx:
    r = all_results[idx]
    # Hitung ulang pakai logika identik
    cf_gejala_manual, cf_akhir_manual, persentase_manual, kategori_manual = gs.calculate_cf(r['max_gejala'])
    
    selisih_cf = abs(cf_akhir_manual - r['cf_akhir'])
    selisih_pers = abs(persentase_manual - r['persentase'])
    sama_kategori = kategori_manual == r['kategori']
    
    status = "COCOK" if (selisih_cf < 0.0001 and selisih_pers < 0.01 and sama_kategori) else "PERBEDAAN"
    print(f"{r['username']} ({r['nama'][:20]}):")
    print(f"  Max per gejala: {r['max_gejala']}")
    print(f"  CF per gejala:  {r['cf_gejala']}")
    print(f"  CF akhir:       seed={r['cf_akhir']}  manual={round(cf_akhir_manual,4)}  selisih={selisih_cf:.4f}")
    print(f"  Persentase:     seed={r['persentase']}%  manual={persentase_manual}%  selisih={selisih_pers:.4f}")
    print(f"  Kategori:       seed={r['kategori']}  manual={kategori_manual}  {'SAMAA' if sama_kategori else 'BEDAA'}")
    print(f"  Status: {status}")
    print()

# Verifikasi semua
print("\n[VERIFIKASI LENGKAP - SEMUA 52 SISWA]")
print("-" * 70)

selisih_total = 0
selisih_maks = 0
beda_kategori = 0

for r in all_results:
    cf_gejala_m, cf_akhir_m, persentase_m, kategori_m = gs.calculate_cf(r['max_gejala'])
    selisih_persentase = abs(persentase_m - r['persentase'])
    selisih_total += selisih_persentase
    selisih_maks = max(selisih_maks, selisih_persentase)
    if kategori_m != r['kategori']:
        beda_kategori += 1

rata_rata_selisih = selisih_total / len(all_results)

print(f"Total siswa: {len(all_results)}")
print(f"Rata-rata selisih persentase: {rata_rata_selisih:.4f}%")
print(f"Selisih maksimum: {selisih_maks:.4f}%")
print(f"Siswa dengan kategori berbeda: {beda_kategori}")
if rata_rata_selisih < 0.01 and beda_kategori == 0:
    print("HASIL: SEMUA COCOK (seed konsisten dengan logika mesin CF)")
else:
    print("HASIL: TERDAPAT PERBEDAAN - perlu inspeksi lebih lanjut")


print("\n" + "=" * 70)
print("REKAP PERUBAHAN DARI SEED LAMA")
print("=" * 70)

# Bandingkan dengan seed lama (backup_t0.sql atau seed lama)
# Kita lihat perubahan persentase dan kategori
print("\n[SAMPEL PERUBAHAN PERSENTASE]")
print("-" * 70)

# Ambil beberapa siswa yang memiliki perubahan significatif
for r in all_results:
    if r['persentase'] > 0 and r['persentase'] != round(r['cf_akhir'] * 100, 2):
        print(f"{r['username']}: persentase seed={r['persentase']}% vs cf_akhir*100={round(r['cf_akhir']*100, 2)}%")

print("\nVerifikasi selesai.")
