<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use Barryvdh\DomPDF\Facade\Pdf;
use App\Models\Gejala;
//use App\Models\Rule;
use App\Models\Pasien;
use App\Models\Diagnosa;
use App\Models\Penyakit;
use Illuminate\Support\Facades\Auth;

class DiagnosaController extends Controller
{

    
    // FORM DIAGNOSA
  
    public function index()
    {
        $gejalas = Gejala::all();

        return view('user.diagnosa', compact('gejalas'));
    }


  
    // PROSES CERTAINTY FACTOR

public function proses(Request $request)
{
    
    // AMBIL GEJALA YANG DIPILIH
   
    $inputGejala = [];

    foreach ($request->gejala ?? [] as $id => $nilai) {

        if (!is_null($nilai) && $nilai !== '') {

            $inputGejala[$id] = (float) $nilai;
        }
    }

  
    // VALIDASI MINIMAL 1 GEJALA
    
    if (empty($inputGejala)) {

        return back()->with(
            'error',
            'Pilih minimal 1 gejala!'
        );
    }

   
    // CEK APAKAH SEMUA TIDAK PERNAH
  
    $semuaTidakPernah = true;

    foreach ($inputGejala as $cf) {

        if ($cf > 0) {

            $semuaTidakPernah = false;
            break;
        }
    }

  
    // AMBIL HIPOTESIS H01
  
    $hipotesis = Penyakit::where('kode', 'H01')->first();

    if (!$hipotesis) {

        return back()->with(
            'error',
            'Hipotesis H01 belum tersedia.'
        );
    }

   
    // DATA PASIEN
   
    $pasien = Pasien::where(
        'user_id',
        Auth::id()
    )->latest()->first();

    if (!$pasien) {

        return back()->with(
            'error',
            'Data pasien belum tersedia.'
        );
    }

    
    // JIKA SEMUA TIDAK PERNAH
    
    if ($semuaTidakPernah) {

        $diagnosa = Diagnosa::create([

            'pasien_id'      => $pasien->id,

            'penyakit_id'    => $hipotesis->id,

            'cf_hasil'       => 0,

            'gejala_dipilih' => json_encode($inputGejala)

        ]);

        return redirect()->route(
            'diagnosa.hasil',
            $diagnosa->id
        );
    }

  
    // AMBIL DATA GEJALA
   
    $gejalas = Gejala::whereIn(
        'id',
        array_keys($inputGejala)
    )->get();

    $cfCombine = null;

    
    // HITUNG CERTAINTY FACTOR
   
    foreach ($gejalas as $gejala) {

        $cfUser = $inputGejala[$gejala->id] ?? 0;

        if ($cfUser <= 0) {
            continue;
        }

        // CF Pakar
        $cfPakar = $gejala->mb - $gejala->md;

        // CF Gejala
        $cfGejala = $cfPakar * $cfUser;

        // Kombinasi CF
        if (is_null($cfCombine)) {

            $cfCombine = $cfGejala;

        } else {

            $cfCombine = $cfCombine + ($cfGejala * (1 - $cfCombine));
        }
    }

   
    // VALIDASI HASIL CF

    if (is_null($cfCombine)) {

        return back()->with(
            'error',
            'Perhitungan Certainty Factor gagal dilakukan.'
        );
    }

    
    // SIMPAN DIAGNOSA
    
    $diagnosa = Diagnosa::create([

        'pasien_id'      => $pasien->id,

        'penyakit_id'    => $hipotesis->id,

        'cf_hasil'       => $cfCombine,

        'gejala_dipilih' => json_encode($inputGejala)

    ]);

    return redirect()->route(
        'diagnosa.hasil',
        $diagnosa->id
    );
}


    
    // HASIL DIAGNOSA
    
    public function hasil($id)
{
    $diagnosa = Diagnosa::with([
        'pasien',
        'penyakit'
    ])->findOrFail($id);

    
    // REKOMENDASI
    
    $diagnosa->rekomendasi =
    $this->getRekomendasi(
        $diagnosa->cf_hasil
    );

    
    // UPAYA PENCEGAHAN
  
    $diagnosa->upaya_pencegahan =
        $this->getUpayaPencegahan(
            $diagnosa->rekomendasi
        );

    
    // RISIKO KOMPLIKASI
   
    $diagnosa->risiko_komplikasi =
        $this->getRisikoKomplikasi(
            $diagnosa->rekomendasi
        );

    if(auth()->user()->role=='admin'){

        return view(
            'admin.hasil',
            compact('diagnosa')
        );

    }

    return view(
        'user.hasil',
        compact('diagnosa')
    );
}

 
// REKOMENDASI PEMERIKSAAN

    private function getRekomendasi($cf)
{
    if ($cf <= 0.20) {
        return 'Lakukan Pemantauan Mandiri';
    } elseif ($cf <= 0.40) {
        return 'Lakukan Pemeriksaan Tekanan Darah';
    } elseif ($cf <= 0.70) {
        return 'Konsultasikan dengan Tenaga Kesehatan';
    }

    return 'Segera Datangi Fasilitas Kesehatan';
}

private function getUpayaPencegahan($rekomendasi)
{
    switch ($rekomendasi) {

        case 'Lakukan Pemantauan Mandiri':
            return '
            <ul>
                <li>Menerapkan pola hidup sehat dengan mengonsumsi makanan bergizi seimbang.</li>
                <li>Mengurangi konsumsi garam, makanan tinggi lemak, dan makanan olahan.</li>
                <li>Melakukan aktivitas fisik secara teratur minimal 30 menit setiap hari.</li>
                <li>Mengelola stres dan mencukupi waktu istirahat.</li>
                <li>Menghindari kebiasaan merokok dan konsumsi alkohol.</li>
                <li>Melakukan pemantauan kondisi kesehatan secara berkala.</li>
            </ul>';

        case 'Lakukan Pemeriksaan Tekanan Darah':
            return '
            <ul>
                <li>Melakukan pemeriksaan tekanan darah menggunakan alat ukur yang valid.</li>
                <li>Pemeriksaan dapat dilakukan secara mandiri maupun di Posbindu, apotek, puskesmas, klinik, atau rumah sakit.</li>
                <li>Mencatat hasil pemeriksaan sebagai bahan pemantauan.</li>
                <li>Menerapkan pola hidup sehat dan mengurangi faktor risiko hipertensi.</li>
                <li>Apabila hasil tekanan darah tinggi secara berulang, segera konsultasikan kepada tenaga kesehatan.</li>
            </ul>';

        case 'Konsultasikan dengan Tenaga Kesehatan':
            return '
            <ul>
                <li>Segera berkonsultasi dengan dokter atau tenaga kesehatan.</li>
                <li>Melakukan pemeriksaan tekanan darah dan evaluasi kondisi kesehatan secara menyeluruh.</li>
                <li>Mengikuti seluruh anjuran tenaga kesehatan terkait pemeriksaan maupun penanganan lanjutan.</li>
                <li>Tidak menunda pemeriksaan apabila gejala masih berlanjut.</li>
                <li>Terapkan pola hidup sehat selama menunggu pemeriksaan.</li>
            </ul>';

        default:
            return '
            <ul>
                <li>Segera mendatangi fasilitas pelayanan kesehatan terdekat.</li>
                <li>Melakukan pemeriksaan medis sesegera mungkin.</li>
                <li>Tidak menunda pemeriksaan apabila gejala semakin berat atau muncul keluhan baru.</li>
                <li>Mengikuti seluruh tindakan medis yang diberikan tenaga kesehatan.</li>
                <li>Apabila mengalami kondisi darurat seperti nyeri dada hebat, sesak napas berat, atau penurunan kesadaran, segera mencari pertolongan medis darurat.</li>
            </ul>';
    }
}

private function getRisikoKomplikasi($rekomendasi)
{
    switch ($rekomendasi) {

        case 'Lakukan Pemantauan Mandiri':
            return '
            Belum terdapat indikasi yang mengarah pada risiko komplikasi akibat hipertensi. 
            Meskipun demikian, pengguna tetap disarankan menerapkan pola hidup sehat dan 
            melakukan pemantauan kondisi kesehatan secara berkala untuk mencegah peningkatan risiko di kemudian hari.
            ';

        case 'Lakukan Pemeriksaan Tekanan Darah':
            return '
            Apabila tekanan darah tinggi tidak segera diketahui melalui pemeriksaan, kondisi tersebut 
            dapat berkembang tanpa disadari dan meningkatkan risiko terjadinya komplikasi hipertensi 
            dalam jangka panjang. Pemeriksaan tekanan darah secara dini sangat dianjurkan.
            ';

        case 'Konsultasikan dengan Tenaga Kesehatan':
            return '
            Kombinasi gejala yang dialami memerlukan evaluasi lebih lanjut oleh tenaga kesehatan. 
            Apabila penyebab keluhan tidak segera diketahui dan ditangani, risiko terjadinya komplikasi 
            yang berhubungan dengan hipertensi maupun penyakit kardiovaskular lainnya dapat meningkat.
            ';

        default:
            return '
            Gejala yang dialami memerlukan evaluasi medis segera. Penundaan pemeriksaan dapat meningkatkan 
            risiko terjadinya komplikasi serius, baik yang berkaitan dengan hipertensi maupun kondisi medis 
            lainnya. Oleh karena itu, segera lakukan pemeriksaan di fasilitas pelayanan kesehatan.
            ';
    }
}
   
    // CETAK PDF
  
    public function pdf($id)
    {
       
        $diagnosa = Diagnosa::with([
    'pasien',
    'penyakit'
    ])->findOrFail($id);
 //dd($diagnosa->gejala_dipilih);
    // Tambahkan rekomendasi pemeriksaan
    $diagnosa->rekomendasi =
    $this->getRekomendasi(
        $diagnosa->cf_hasil
    );

$diagnosa->upaya_pencegahan =
    $this->getUpayaPencegahan($diagnosa->rekomendasi);

$diagnosa->risiko_komplikasi =
    $this->getRisikoKomplikasi($diagnosa->rekomendasi);
       
        // AMBIL DATA GEJALA DIPILIH
    
        $gejalaData = json_decode(
            $diagnosa->gejala_dipilih,
            true
        ) ?? [];

        // ambil ID gejala
        $gejalaIds = array_keys($gejalaData);

        // ambil data gejala dari database
        $gejalas = Gejala::whereIn(
            'id',
            $gejalaIds
        )->get();

      
        // TAMBAHKAN CF USER
   
        foreach ($gejalas as $g) {

            // ambil nilai user
            $g->cf_user = $gejalaData[$g->id] ?? 0;

            // ubah ke teks
            if ($g->cf_user == 1) {

                $g->keterangan_cf = 'Sangat Sering';

            } elseif ($g->cf_user == 0.7) {

                $g->keterangan_cf = 'Sering';

            } elseif ($g->cf_user == 0.4) {

                $g->keterangan_cf = 'Kadang-Kadang';

            } else {

                $g->keterangan_cf = 'Tidak Pernah';
            }
        }

      
        // GENERATE PDF
      
        $pdf = Pdf::loadView(
            'pdf.diagnosa',
            compact(
                'diagnosa',
                'gejalas'
            )
        );

        return $pdf->download(
            'hasil_diagnosa_' .
            $diagnosa->id .
            '.pdf'
        );
    }


  
// RIWAYAT USER

public function riwayat()
{
    $pasien = Pasien::where(
        'user_id',
        Auth::id()
    )->first();

    $perPage = request()->perPage ?? 5;

    if (!$pasien) {

        $data = Diagnosa::where('id', 0)
            ->paginate($perPage);

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

    $data = Diagnosa::with([
            'penyakit',
            'pasien'
        ])
        ->where('pasien_id', $pasien->id)
        ->latest()
        ->paginate($perPage)
        ->withQueryString();


    // TAMBAHKAN REKOMENDASI
   
    foreach ($data as $diagnosa) {

        $diagnosa->rekomendasi =
    $this->getRekomendasi(
        $diagnosa->cf_hasil
    );

    }

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



// DASHBOARD USER

public function dashboard(Request $request)
{
    $pasien = Pasien::where(
        'user_id',
        auth()->id()
    )->first();

    $perPage = $request->perPage ?? 5;

    $totalDiagnosa = 0;

    $lastDiagnosa = null;

    $riwayat = collect();

    if ($pasien) {

        $riwayat = Diagnosa::with('penyakit')
            ->where('pasien_id', $pasien->id)
            ->latest()
            ->paginate($perPage)
            ->withQueryString();

       
        // TAMBAHKAN REKOMENDASI
    
        foreach ($riwayat as $diagnosa) {

            $diagnosa->rekomendasi =
    $this->getRekomendasi(
        $diagnosa->cf_hasil
    );

        }

        $totalDiagnosa = Diagnosa::where(
            'pasien_id',
            $pasien->id
        )->count();

        $lastDiagnosa = Diagnosa::where(
            'pasien_id',
            $pasien->id
        )->latest()
        ->first();

        if ($lastDiagnosa) {

            $lastDiagnosa->rekomendasi =
    $this->getRekomendasi(
        $lastDiagnosa->cf_hasil
    );

        }
    }

    return view(
        'user.dashboard',
        compact(
            'totalDiagnosa',
            'lastDiagnosa',
            'riwayat',
            'perPage'
        )
    );
}
}