<?php

namespace App\Http\Controllers;

use App\Http\Controllers\Controller;
use App\Models\Pasien;
use App\Models\PemeriksaanKesehatan;
use App\Models\AnalisisAi;
use App\Models\DokterPasien;
use App\Models\Dokter;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Str;
use Carbon\Carbon;

class DokterDashboardController extends Controller
{
    protected $dokter;

    public function __construct()
    {
        // Constructor kosong - middleware dihandle di routes
    }

    /**
     * Initialize dokter profile for authenticated user
     */
    protected function initializeDokter()
    {
        $user = Auth::user();

        if (!$user || $user->role !== 'dokter') {
            abort(403, 'Unauthorized.');
        }

        if (!$this->dokter) {
            $this->dokter = $this->ensureDokterProfile($user);
        }
    }

    // =========================================================================
    // UPDATE PENANGANAN
    // =========================================================================

    public function updatePenangananForm($id)
    {
        $this->initializeDokter();

        $penanganan = DokterPasien::where('dokter_id', $this->dokter->id)
            ->where('pasien_id', $id)
            ->where('status_penanganan', 'AKTIF')
            ->firstOrFail();

        $pasien = Pasien::findOrFail($id);

        return view('dokter.pasien.update-penanganan', compact('pasien', 'penanganan'));
    }

    public function updatePenangananStore(Request $request, $id)
    {
        $this->initializeDokter();

        $request->validate([
            'diagnosis_utama'            => 'required|string|max:500',
            'rencana_perawatan'          => 'nullable|string',
            'resep_dokter'               => 'nullable|string',
            'catatan_dokter'             => 'nullable|string',
            'tanggal_kontrol_berikutnya' => 'nullable|date|after_or_equal:today',
            'status_penanganan'          => 'required|in:AKTIF,SELESAI,RUJUK,DIRUJUK',
        ]);

        $penanganan = DokterPasien::where('dokter_id', $this->dokter->id)
            ->where('pasien_id', $id)
            ->firstOrFail();

        $penanganan->update([
            'diagnosis_utama'            => $request->diagnosis_utama,
            'rencana_perawatan'          => $request->rencana_perawatan,
            'resep_dokter'               => $request->resep_dokter,
            'catatan_dokter'             => $request->catatan_dokter,
            'tanggal_kontrol_berikutnya' => $request->tanggal_kontrol_berikutnya ?: null,
            'status_penanganan'          => $request->status_penanganan,
        ]);

        if ($request->resep_dokter) {
            $pemeriksaan = PemeriksaanKesehatan::where('pasien_id', $id)
                ->whereNull('diagnosis_dokter')
                ->latest('waktu_pemeriksaan')
                ->first();

            if ($pemeriksaan) {
                $pemeriksaan->update([
                    'dokter_id'             => $this->dokter->id,
                    'diagnosis_dokter'      => $request->diagnosis_utama,
                    'resep_obat'            => $request->resep_dokter,
                    'catatan_dokter'        => $request->catatan_dokter,
                    'sudah_direview_dokter' => true,
                    'waktu_review_dokter'   => now(),
                ]);
            }
        }

        if (in_array($request->status_penanganan, ['SELESAI', 'RUJUK', 'DIRUJUK'])) {
            $penanganan->update([
                'tanggal_selesai_menangani' => now()->toDateString(),
            ]);
        }

        return redirect()->route('dokter.pasien.detail', $id)
            ->with('success', 'Data penanganan berhasil diperbarui.');
    }

    // =========================================================================
    // DASHBOARD
    // =========================================================================

    public function index()
    {
        $this->initializeDokter();

        // Ambil SEMUA pasien dokter ini (tanpa filter status)
        $pasienIds = DokterPasien::where('dokter_id', $this->dokter->id)
            ->pluck('pasien_id');

        $stats = [
            'total_pasien'         => DokterPasien::where('dokter_id', $this->dokter->id)->count(),
            'konsultasi_hari_ini'  => DokterPasien::where('dokter_id', $this->dokter->id)
                                        ->whereDate('created_at', today())->count(),
            'konsultasi_pending'   => DokterPasien::where('dokter_id', $this->dokter->id)
                                        ->where('status_konsultasi', 'MENUNGGU')->count(),
            'konsultasi_selesai'   => DokterPasien::where('dokter_id', $this->dokter->id)
                                        ->whereIn('status_konsultasi', ['SELESAI_KONSUL', 'LUNAS'])
                                        ->whereDate('updated_at', today())->count(),
            'pemeriksaan_hari_ini' => PemeriksaanKesehatan::whereIn('pasien_id', $pasienIds)
                                        ->whereDate('waktu_pemeriksaan', today())->count(),
            'perlu_review'         => AnalisisAi::whereIn('pasien_id', $pasienIds)
                                        ->where('ditinjau_dokter', false)->count(),
            'analisis_ai_pending'  => AnalisisAi::whereIn('pasien_id', $pasienIds)
                                        ->where('ditinjau_dokter', false)->count(),
        ];

        $jadwal_hari_ini = DokterPasien::where('dokter_id', $this->dokter->id)
            ->where('status_penanganan', 'AKTIF')
            ->whereDate('tanggal_kontrol_berikutnya', today())
            ->with('pasien')
            ->get();

        // ← FIX: kirim konsultasi_terbaru ke blade (bukan pemeriksaan)
        $konsultasi_terbaru = DokterPasien::where('dokter_id', $this->dokter->id)
            ->with('pasien')
            ->orderBy('created_at', 'desc')
            ->limit(5)
            ->get();

        $pemeriksaan_terbaru = PemeriksaanKesehatan::whereIn('pasien_id', $pasienIds)
            ->with('pasien')
            ->orderBy('waktu_pemeriksaan', 'desc')
            ->limit(5)
            ->get();

        $analisis_ai_pending = AnalisisAi::whereIn('pasien_id', $pasienIds)
            ->where('ditinjau_dokter', false)
            ->with('pasien')
            ->orderBy('waktu_analisis', 'desc')
            ->limit(5)
            ->get();

        // Chart 1: Pemeriksaan 7 hari terakhir
        $chart_pemeriksaan = collect(range(6, 0))->map(function ($daysAgo) use ($pasienIds) {
            $date  = Carbon::today()->subDays($daysAgo);
            $total = PemeriksaanKesehatan::whereIn('pasien_id', $pasienIds)
                ->whereDate('waktu_pemeriksaan', $date)->count();
            return ['label' => $date->isoFormat('D MMM'), 'total' => $total];
        })->values();

        // Chart 2: Distribusi kategori suhu
        $suhuMap = [
            'NORMAL'       => 'Normal',
            'SUBFEBRIS'    => 'Subfebris',
            'DEMAM_RINGAN' => 'Demam Ringan',
            'DEMAM_SEDANG' => 'Demam Sedang',
            'DEMAM_TINGGI' => 'Demam Tinggi',
        ];
        $chart_suhu = PemeriksaanKesehatan::whereIn('pasien_id', $pasienIds)
            ->whereNotNull('kategori_suhu')
            ->selectRaw('kategori_suhu, COUNT(*) as total')
            ->groupBy('kategori_suhu')
            ->get()
            ->map(fn ($row) => [
                'label' => $suhuMap[$row->kategori_suhu] ?? 'Tidak Diketahui',
                'total' => $row->total,
            ]);

        if ($chart_suhu->isEmpty()) {
            $chart_suhu = collect([['label' => 'Belum ada data', 'total' => 1]]);
        }

        return view('dokter.dashboard', compact(
            'stats', 'jadwal_hari_ini', 'pemeriksaan_terbaru',
            'analisis_ai_pending', 'chart_pemeriksaan', 'chart_suhu',
            'konsultasi_terbaru'  // ← tambahan fix
        ));
    }

    // =========================================================================
    // ENSURE DOKTER PROFILE
    // =========================================================================

    protected function ensureDokterProfile($user)
    {
        $dokter = $user->dokter;

        if (!$dokter) {
            $dokter = Dokter::create([
                'user_id'           => $user->id,
                'kode_dokter'       => $this->generateKodeDokter(),
                'nama_lengkap'      => $user->name,
                'jenis_kelamin'     => 'L',
                'tanggal_lahir'     => now()->subYears(30)->format('Y-m-d'),
                'tempat_lahir'      => '-',
                'spesialisasi'      => 'Umum',
                'jenis_dokter'      => 'DOKTER_UMUM',
                'status_dokter'     => 'AKTIF',
                'tanggal_bergabung' => now()->format('Y-m-d'),
                'usia'              => 30,
            ]);
        }

        return $dokter;
    }

    protected function generateKodeDokter()
    {
        $lastDokter = Dokter::withTrashed()->latest('id')->first();
        $nextNumber = $lastDokter ? ($lastDokter->id + 1) : 1;
        return 'DOK-' . str_pad($nextNumber, 4, '0', STR_PAD_LEFT);
    }

    // =========================================================================
    // DAFTAR PASIEN SAYA
    // =========================================================================

    public function myPatients(Request $request)
    {
        $this->initializeDokter();

        $query = DokterPasien::where('dokter_id', $this->dokter->id)
            ->with('pasien')
            ->orderBy('updated_at', 'desc');

        if ($search = $request->get('search')) {
            $query->whereHas('pasien', function ($q) use ($search) {
                $q->where('nama_lengkap', 'like', "%{$search}%")
                  ->orWhere('no_rekam_medis', 'like', "%{$search}%")
                  ->orWhere('nik', 'like', "%{$search}%");
            });
        }

        if ($status = $request->get('status_dokter')) {
            $query->where('status_penanganan', $status);
        }

        $pasienList = $query->paginate(10);

        $stats = [
            'total'            => DokterPasien::where('dokter_id', $this->dokter->id)->count(),
            'aktif'            => DokterPasien::where('dokter_id', $this->dokter->id)
                                     ->where('status_penanganan', 'AKTIF')->count(),
            'kontrol_hari_ini' => DokterPasien::where('dokter_id', $this->dokter->id)
                                     ->where('status_penanganan', 'AKTIF')
                                     ->whereDate('tanggal_kontrol_berikutnya', today())->count(),
        ];

        $statusList = [
            'AKTIF'     => 'Aktif',
            'SELESAI'   => 'Selesai',
            'RUJUK'     => 'Rujuk',
            'MENINGGAL' => 'Meninggal',
        ];

        $jenisDokterList = [
            'DOKTER_UMUM'                     => 'Dokter Umum',
            'DOKTER_GIGI'                     => 'Dokter Gigi',
            'DOKTER_SPESIALIS_ANAK'           => 'Spesialis Anak',
            'DOKTER_SPESIALIS_KANDUNGAN'      => 'Spesialis Kandungan',
            'DOKTER_SPESIALIS_PENYAKIT_DALAM' => 'Spesialis Penyakit Dalam',
            'DOKTER_SPESIALIS_BEDAH'          => 'Spesialis Bedah',
            'DOKTER_SPESIALIS_MATA'           => 'Spesialis Mata',
            'DOKTER_SPESIALIS_THT'            => 'Spesialis THT',
            'DOKTER_SPESIALIS_KULIT'          => 'Spesialis Kulit',
            'DOKTER_SPESIALIS_JANTUNG'        => 'Spesialis Jantung',
            'LAINNYA'                         => 'Lainnya',
        ];

        return view('dokter.pasien.index', [
            'pasien'          => $pasienList,
            'dokters'         => $pasienList,
            'stats'           => $stats,
            'statusList'      => $statusList,
            'jenisDokterList' => $jenisDokterList,
        ]);
    }

    // =========================================================================
    // AUTO-ASSIGN PASIEN
    // =========================================================================

    public function autoAssignPatients()
    {
        $this->initializeDokter();

        $pasienPerluDokter = Pasien::where('status_pasien', 'AKTIF')
            ->whereDoesntHave('dokterPasien', function ($query) {
                $query->where('status_penanganan', 'AKTIF');
            })
            ->whereHas('pemeriksaanKesehatan', function ($query) {
                $query->where('suhu_tubuh', '>', 39)
                      ->orWhereIn('kategori_suhu', ['DEMAM_TINGGI', 'DEMAM_SEDANG']);
            })
            ->limit(5)
            ->get();

        foreach ($pasienPerluDokter as $pasien) {
            DokterPasien::create([
                'dokter_id'               => $this->dokter->id,
                'pasien_id'               => $pasien->id,
                'tanggal_mulai_menangani' => now()->toDateString(),
                'status_penanganan'       => 'AKTIF',
                'diagnosis_utama'         => 'Perlu evaluasi dokter - Demam tinggi terdeteksi',
                'rencana_perawatan'       => 'Pemeriksaan lanjutan dan observasi',
                'didaftarkan_oleh'        => Auth::id(),
            ]);
        }

        return redirect()->back()
            ->with('success', 'Auto-assign pasien selesai: ' . $pasienPerluDokter->count() . ' pasien ditambahkan.');
    }

    // =========================================================================
    // DETAIL PASIEN
    // =========================================================================

    public function pasienDetail($id)
    {
        $this->initializeDokter();

        $penanganan = DokterPasien::where('dokter_id', $this->dokter->id)
            ->where('pasien_id', $id)
            ->first();

        if (!$penanganan) {
            abort(404, 'Pasien tidak ditemukan atau tidak dalam penanganan Anda.');
        }

        $pasien = Pasien::findOrFail($id);

        $riwayat_pemeriksaan = PemeriksaanKesehatan::where('pasien_id', $id)
            ->orderBy('waktu_pemeriksaan', 'desc')
            ->paginate(10);

        $analisis_ai = AnalisisAi::where('pasien_id', $id)
            ->orderBy('waktu_analisis', 'desc')
            ->paginate(10);

        $stats = [
            'total_pemeriksaan' => PemeriksaanKesehatan::where('pasien_id', $id)->count(),
            'total_demam'       => PemeriksaanKesehatan::where('pasien_id', $id)
                                       ->whereIn('kategori_suhu', ['DEMAM_RINGAN', 'DEMAM_SEDANG', 'DEMAM_TINGGI'])
                                       ->count(),
            'total_normal'      => PemeriksaanKesehatan::where('pasien_id', $id)
                                       ->where('kategori_suhu', 'NORMAL')
                                       ->count(),
        ];

        return view('dokter.pasien.show', compact(
            'pasien', 'penanganan', 'riwayat_pemeriksaan', 'analisis_ai', 'stats'
        ));
    }

    // =========================================================================
    // JADWAL KONTROL
    // =========================================================================

    public function jadwalKontrol()
    {
        $this->initializeDokter();

        $jadwal = DokterPasien::where('dokter_id', $this->dokter->id)
            ->where('status_penanganan', 'AKTIF')
            ->with('pasien')
            ->orderBy('tanggal_kontrol_berikutnya')
            ->get();

        return view('dokter.jadwal.index', compact('jadwal'));
    }

    public function updateJadwalKontrol(Request $request, $dokterPasienId)
    {
        $this->initializeDokter();

        $request->validate([
            'tanggal_kontrol_berikutnya' => 'required|date|after_or_equal:today',
        ]);

        $jadwal = DokterPasien::where('dokter_id', $this->dokter->id)
            ->where('id', $dokterPasienId)
            ->firstOrFail();

        $jadwal->update([
            'tanggal_kontrol_berikutnya' => $request->tanggal_kontrol_berikutnya,
        ]);

        return redirect()->back()->with('success', 'Jadwal kontrol diperbarui.');
    }

    // =========================================================================
    // REVIEW & ANALISIS AI
    // =========================================================================

    public function reviewList()
    {
        $this->initializeDokter();

        $pasienIds = DokterPasien::where('dokter_id', $this->dokter->id)
            ->pluck('pasien_id');

        $analisis = AnalisisAi::whereIn('pasien_id', $pasienIds)
            ->where('ditinjau_dokter', false)
            ->with(['pasien', 'pemeriksaanKesehatan'])
            ->orderBy('waktu_analisis', 'desc')
            ->get();

        return view('dokter.review.index', compact('analisis'));
    }

    public function reviewShow($id)
    {
        $this->initializeDokter();

        $analisis = AnalisisAi::with(['pasien', 'pemeriksaanKesehatan'])->findOrFail($id);

        $isMyPatient = DokterPasien::where('dokter_id', $this->dokter->id)
            ->where('pasien_id', $analisis->pasien_id)
            ->exists();

        if (!$isMyPatient) {
            abort(403, 'Anda tidak berhak mengakses analisis ini.');
        }

        return view('dokter.review.show', compact('analisis'));
    }

    public function reviewStore(Request $request, $id)
    {
        $this->initializeDokter();

        $request->validate([
            'diagnosis_dokter' => 'required|string',
            'catatan_dokter'   => 'nullable|string',
            'resep_dokter'     => 'nullable|string',
        ]);

        $analisis = AnalisisAi::findOrFail($id);

        $isMyPatient = DokterPasien::where('dokter_id', $this->dokter->id)
            ->where('pasien_id', $analisis->pasien_id)
            ->exists();

        if (!$isMyPatient) {
            abort(403, 'Anda tidak berhak mereview analisis ini.');
        }

        $analisis->update([
            'ditinjau_dokter' => true,
            'catatan_dokter'  => $request->catatan_dokter,
            'ditinjau_oleh'   => Auth::id(),
            'waktu_ditinjau'  => now(),
        ]);

        if ($analisis->pemeriksaanKesehatan) {
            $analisis->pemeriksaanKesehatan->update([
                'dokter_id'             => $this->dokter->id,
                'diagnosis_dokter'      => $request->diagnosis_dokter,
                'resep_obat'            => $request->resep_dokter,
                'catatan_dokter'        => $request->catatan_dokter,
                'sudah_direview_dokter' => true,
                'waktu_review_dokter'   => now(),
            ]);
        }

        return redirect()->route('dokter.review.index')
            ->with('success', 'Review berhasil disimpan.');
    }

    // Alias untuk backward compatibility
    public function analisisAiList()                                          { return $this->reviewList(); }
    public function analisisAiShow($id)                                       { return $this->reviewShow($id); }
    public function analisisAiReview(Request $request, $id)                   { return $this->reviewStore($request, $id); }
    public function analisisAiReviewForm($analisisAiId)
    {
        $this->initializeDokter();
        $analisis = AnalisisAi::with(['pasien', 'pemeriksaanKesehatan'])->findOrFail($analisisAiId);
        return view('dokter.review.show', compact('analisis'));
    }
}