<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
use App\Models\Gejala;
use App\Models\Penyakit;
use App\Models\Aturan;
use App\Models\Diagnosa;
use App\Models\DetailDiagnosa;

class DiagnosisController extends Controller
{
    public function index()
    {
        $gejala = Gejala::all();
        return view('user.diagnosis', compact('gejala'));
    }

    public function proses(Request $request)
    {
        // =====================================================
        // REVISI 2 & 3: Minimal 3 gejala + peringatan
        // =====================================================
        $request->validate([
            'gejala' => 'required|array|min:3',
            'gejala.*' => 'string'
        ], [
            'gejala.min' => '⚠️ PERINGATAN: Anda harus memilih minimal 3 gejala untuk melakukan diagnosis sesuai dengan rule base yang telah ditetapkan pakar.'
        ]);

        $kodeGejalaDipilih = $request->gejala;
        $cfUser = $request->cf_user;

        $gejalaDipilih = Gejala::whereIn('kode', $kodeGejalaDipilih)->get();

        if ($gejalaDipilih->count() == 0) {
            return view('user.hasil', [
                'hasil' => null,
                'pesan' => 'Gejala tidak ditemukan.',
                'gejalaDipilih' => collect()
            ]);
        }

        $gejalaIds = $gejalaDipilih->pluck('id')->toArray();

        // =====================================================
        // AMBIL SEMUA ATURAN
        // =====================================================
        $semuaAturan = Aturan::all();

        $aturanPerPenyakit = [];
        foreach ($semuaAturan as $aturan) {
            $aturanPerPenyakit[$aturan->penyakit_id][] = $aturan->gejala_id;
        }

        // =====================================================
        // REVISI 1: AND LOGIC - Rule hanya aktif jika SEMUA gejala terpenuhi
        // =====================================================
        $hasil = null;
        $nilaiTertinggi = 0;

        foreach ($aturanPerPenyakit as $penyakitId => $gejalaRequired) {
            
            // CEK APAKAH SEMUA GEJALA YANG DIBUTUHKAN ADA
            $semuaGejalaTerpenuhi = true;
            
            foreach ($gejalaRequired as $gejalaId) {
                if (!in_array($gejalaId, $gejalaIds)) {
                    $semuaGejalaTerpenuhi = false;
                    break;
                }
            }
            
            // =====================================================
            // HANYA PROSES JIKA SEMUA GEJALA TERPENUHI (RULE AKTIF)
            // JIKA TIDAK, RULE DIABAIKAN (TIDAK DIHITUNG CF-NYA)
            // =====================================================
            if ($semuaGejalaTerpenuhi) {
                $cfGabungan = 0;
                
                foreach ($gejalaRequired as $gejalaId) {
                    $aturan = Aturan::where('penyakit_id', $penyakitId)
                                    ->where('gejala_id', $gejalaId)
                                    ->first();

                    if ($aturan) {
                        $kodeGejala = Gejala::find($gejalaId)->kode;
                        $cfUserValue = isset($cfUser[$kodeGejala]) ? (float) $cfUser[$kodeGejala] : 0;
                        $cf = $aturan->cf_pakar * $cfUserValue;

                        if ($cfGabungan == 0) {
                            $cfGabungan = $cf;
                        } else {
                            $cfGabungan = $cfGabungan + ($cf * (1 - $cfGabungan));
                        }
                    }
                }

                $nilai = $cfGabungan * 100;

                if ($nilai > $nilaiTertinggi) {
                    $nilaiTertinggi = $nilai;
                    $hasil = Penyakit::find($penyakitId);
                }
            }
            // =====================================================
            // JIKA TIDAK TERPENUHI: rule DIABAIKAN (tidak ada perhitungan)
            // =====================================================
        }

        // =====================================================
        // HASIL DIAGNOSA
        // =====================================================
        if ($hasil == null) {
            return view('user.hasil', [
                'hasil' => null,
                'pesan' => '⚠️ Tidak ditemukan penyakit yang sesuai. Pastikan gejala yang Anda pilih MEMENUHI SEMUA KRITERIA penyakit yang telah ditetapkan pakar. Contoh: Untuk penyakit Bulai, Anda harus memilih G1, G2, G3, G4 secara lengkap.',
                'gejalaDipilih' => $gejalaDipilih
            ]);
        }

        return view('user.hasil', [
            'hasil' => $hasil,
            'gejalaDipilih' => $gejalaDipilih,
            'persentase' => $nilaiTertinggi
        ]);
    }

    public function simpan(Request $request)
    {
        $request->validate([
            'penyakit_id' => 'required|integer|exists:penyakit,id',
            'cf_hasil'    => 'required|numeric',
            'gejala_id'   => 'required|array|min:3',
            'gejala_id.*' => 'integer|exists:gejala,id',
            'cf_user'     => 'required|array'
        ]);

        $diagnosa = Diagnosa::create([
            'pengguna_id' => Auth::id(),
            'penyakit_id' => $request->penyakit_id,
            'cf_hasil'    => $request->cf_hasil,
            'tanggal'     => now()
        ]);

        foreach ($request->gejala_id as $gid) {
            DetailDiagnosa::create([
                'diagnosa_id' => $diagnosa->id,
                'gejala_id'   => $gid,
                'cf_user'     => $request->cf_user[$gid] ?? 0
            ]);
        }

        return redirect()->route('riwayat')
            ->with('success', 'Diagnosa berhasil disimpan.');
    }

    public function riwayat()
    {
        $riwayat = Diagnosa::where('pengguna_id', Auth::id())
            ->with(['penyakit', 'detailDiagnosa.gejala'])
            ->orderBy('tanggal', 'desc')
            ->get();

        return view('user.riwayat', compact('riwayat'));
    }
}