from flask import Flask, render_template, request, redirect, url_for
import pymysql

app = Flask(__name__)

# =================================================================
# FUNGSI KONEKSI DATABASE MYSQL KHUSUS LARAGON (KONFIGURASI LARAVEL)
# =================================================================
def get_db_connection():
    return pymysql.connect(
        host="127.0.0.1",
        user="root",              # Username default database Laragon
        password="",              # Password default database Laragon (kosong)
        database="sistem_pakar",  # Nama database MySQL Anda di phpMyAdmin
        port=3306,                # Port default MySQL di Laragon
        cursorclass=pymysql.cursors.DictCursor # Hasil query berformat Dictionary agar mempermudah pemanggilan data
    )

# =================================================================
# ROUTES & INFERENCE ENGINE (FORWARD CHAINING)
# =================================================================

@app.route('/')
def landing_page():
    return render_template('index.html')

@app.route('/diagnosa')
def input_page():
    conn = get_db_connection()
    with conn.cursor() as cursor:
        # Mengambil daftar gejala dari tabel 'symptoms' (Struktur database Laravel)
        cursor.execute("SELECT id, code, name FROM symptoms")
        symptoms = cursor.fetchall()
    conn.close()
    return render_template('input.html', symptoms=symptoms)

@app.route('/diagnosa/proses', methods=['POST'])
def diagnose():
    # 1. Mengambil data fakta input gejala dari user melalui form
    selected_symptom_ids = request.form.getlist('symptoms')
    
    if not selected_symptom_ids:
        return redirect(url_for('input_page'))
    
    conn = get_db_connection()
    with conn.cursor() as cursor:
        # Mengambil detail text gejala yang dicentang oleh user
        format_strings = ','.join(['%s'] * len(selected_symptom_ids))
        cursor.execute(f"SELECT id, code, name FROM symptoms WHERE id IN ({format_strings})", tuple(selected_symptom_ids))
        selected_symptoms_data = cursor.fetchall()
        
        selected_symptoms = {str(s['id']): f"({s['code']}) {s['name']}" for s in selected_symptoms_data}
        
        # Mengambil semua data kerusakan dari tabel 'diagnoses'
        cursor.execute("SELECT id, code, name, solution FROM diagnoses")
        all_diagnoses = cursor.fetchall()
        
        matched_diagnoses = []

        # 2. IMPLEMENTASI FORWARD CHAINING & KALKULASI AKURASI RUMUS MATEMATIS
        for diagnosis in all_diagnoses:
            # Mengambil rules pemetaan dari tabel 'rules' relasi Laravel
            cursor.execute("SELECT symptom_id FROM rules WHERE diagnosis_id = %s", (diagnosis['id'],))
            rules_data = cursor.fetchall()
            required_symptom_ids = [str(r['symptom_id']) for r in rules_data]
            
            if not required_symptom_ids:
                continue
                
            # Mencari kesamaan/irisan gejala (Rule Matching)
            matched_symptoms_set = set(required_symptom_ids) & set(selected_symptom_ids)
            
            total_required = len(required_symptom_ids)
            total_matched = len(matched_symptoms_set)
            
            # Rumus Hitung Akurasi: (Cocok / Syarat Pakar) * 100
            accuracy_percentage = (total_matched / total_required) * 100
            
            # Threshold Batas Kelayakan Konklusi (Minimal 50% Kecocokan)
            if accuracy_percentage >= 50:
                matched_diagnoses.append({
                    "code": diagnosis['code'],
                    "name": diagnosis['name'],
                    "accuracy": round(accuracy_percentage, 2),
                    "solution": diagnosis['solution']
                })
                
    conn.close()
    
    # Mengurutkan hasil diagnosa berdasarkan persentase akurasi tertinggi (Descending)
    matched_diagnoses = sorted(matched_diagnoses, key=lambda x: x['accuracy'], reverse=True)

    return render_template('result.html', 
                           matched_diagnoses=matched_diagnoses, 
                           selected_symptoms=selected_symptoms)

if __name__ == '__main__':
    app.run(debug=True, port=8000)