<?php

namespace App\Http\Controllers;

use App\Models\Laporan;
use App\Models\TindakanSatgas;
use App\Models\TindakanPenilai;
use App\Models\CatatanKlinisPsikolog;
use App\Models\EksekusiRektor;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;

class AlurKasusController extends Controller
{
    // 0. Admin Decision Gatekeeper
    public function adminKeputusanStore(Request $request, Laporan $laporan)
    {
        $user = Auth::user();
        if (!$user->isAdmin()) {
            abort(403, 'Akses khusus Admin.');
        }

        $request->validate([
            'admin_keputusan' => 'required|in:Terima,Tolak',
            'alasan_penolakan' => 'required_if:admin_keputusan,Tolak|string|nullable',
        ]);

        if ($request->admin_keputusan === 'Tolak') {
            $laporan->update([
                'status' => 'ditolak',
                'deskripsi' => $laporan->deskripsi . "\n\n[DITOLAK ADMIN]: " . $request->alasan_penolakan,
                'alasan_penolakan' => $request->alasan_penolakan
            ]);

            $pesan = "Laporan Anda (ID: #K-" . str_pad($laporan->id, 4, '0', STR_PAD_LEFT) . ") ditolak.\nAlasan: " . $request->alasan_penolakan;
            $phone = preg_replace('/[^0-9]/', '', $laporan->no_telepon);
            if (str_starts_with($phone, '0')) $phone = '62' . substr($phone, 1);
            $wa_url = "https://wa.me/{$phone}?text=" . urlencode($pesan);

            return redirect()->route('laporan.show', $laporan->id)
                ->with('success', 'Laporan berhasil ditolak.')
                ->with('wa_link', $wa_url);
        }

        // If 'Terima', we don't necessarily change the state, 
        // we just record that Admin verified it (optional: you could add an admin_verified_at timestamp).
        // Since the workflow already routes correctly based on type, just returning success is fine,
        // or we could add a note in the description.
        $laporan->update([
            'deskripsi' => $laporan->deskripsi . "\n\n[DIVERIFIKASI ADMIN]: Kasus diteruskan ke tahap selanjutnya."
        ]);

        return redirect()->route('laporan.show', $laporan->id)
            ->with('success', 'Laporan telah diverifikasi dan dilanjutkan ke proses selanjutnya.');
    }

    // 1. Satgas Kampus Action
    public function satgasStore(Request $request, Laporan $laporan)
    {
        $user = Auth::user();
        if (!$user->isAdmin()) {
            abort(403, 'Akses khusus Admin.');
        }

        if ($laporan->status !== 'menunggu_satgas') {
            if ($laporan->tindakanSatgas) {
                return back()->with('error', 'Laporan telah ditangani oleh Satgas Kampus.');
            }
            return back()->with('error', 'Status laporan tidak berada dalam antrean Satgas Kampus.');
        }

        $request->validate([
            'satgas_keputusan' => 'required|in:Terima,Tolak',
            'bantuan_hukum_rumah_aman' => 'required_if:satgas_keputusan,Terima|string|nullable',
            'catatan' => 'nullable|string',
            'alasan_penolakan' => 'required_if:satgas_keputusan,Tolak|string|nullable',
        ]);

        if ($request->satgas_keputusan === 'Tolak') {
            $laporan->update([
                'status' => 'ditolak',
                'deskripsi' => $laporan->deskripsi . "\n\n[DITOLAK SATGAS]: " . $request->alasan_penolakan
            ]);
            
            TindakanSatgas::updateOrCreate(
                ['laporan_id' => $laporan->id],
                [
                    'satgas_id' => $user->id,
                    'lindungi_korban' => false,
                    'bantuan_hukum_rumah_aman' => '-',
                    'catatan' => 'Laporan Ditolak: ' . $request->alasan_penolakan,
                ]
            );

            $pesan = "Laporan Anda (ID: #K-" . str_pad($laporan->id, 4, '0', STR_PAD_LEFT) . ") ditolak.\nAlasan: " . $request->alasan_penolakan;
            $phone = preg_replace('/[^0-9]/', '', $laporan->no_telepon);
            if (str_starts_with($phone, '0')) $phone = '62' . substr($phone, 1);
            $wa_url = "https://wa.me/{$phone}?text=" . urlencode($pesan);

            return redirect()->route('laporan.show', $laporan->id)
                ->with('success', 'Laporan berhasil ditolak.')
                ->with('wa_link', $wa_url);
        }

        TindakanSatgas::updateOrCreate(
            ['laporan_id' => $laporan->id],
            [
                'satgas_id' => $user->id,
                'lindungi_korban' => true,
                'bantuan_hukum_rumah_aman' => $request->bantuan_hukum_rumah_aman,
                'catatan' => $request->catatan,
            ]
        );

        // Move status to menunggu_psikolog (Satgas Kampus -> Psikolog)
        $laporan->update(['status' => 'menunggu_psikolog']);

        return redirect()->route('laporan.show', $laporan->id)
            ->with('success', 'Tindakan Satgas berhasil disimpan. Laporan dialirkan ke Psikolog untuk penanganan psikologis.');
    }

    // 2. Tim Penilai Ilmiah Action
    public function penilaiStore(Request $request, Laporan $laporan)
    {
        $user = Auth::user();
        if (!($user->isAdmin() || ($user->isPenilaiRole() && $laporan->pts_nama === $user->pts_nama))) {
            abort(403, 'Akses khusus Admin atau Tim Penilai Ilmiah PTS yang bersangkutan.');
        }

        if ($laporan->status !== 'menunggu_penilai') {
            if ($laporan->tindakanPenilai) {
                return back()->with('error', 'Laporan telah dinilai oleh Tim Penilai Ilmiah.');
            }
            return back()->with('error', 'Status laporan tidak berada dalam antrean Tim Penilai Ilmiah.');
        }

        $request->validate([
            'penilai_keputusan' => 'required|in:Terima,Tolak',
        ]);

        if ($request->penilai_keputusan === 'Tolak') {
            $request->validate(['alasan_penolakan' => 'required|string']);
            
            $laporan->update([
                'status' => 'ditolak',
                'alasan_penolakan' => $request->alasan_penolakan,
            ]);

            $pesan = "Mohon maaf, laporan dugaan Plagiarisme Anda (Kasus #K-".str_pad($laporan->id, 4, '0', STR_PAD_LEFT).") dengan judul '{$laporan->judul}' telah ditolak oleh Tim Penilai Ilmiah PTS.\n\nAlasan Penolakan:\n{$request->alasan_penolakan}\n\nTerima kasih.";
            $phone = preg_replace('/[^0-9]/', '', $laporan->no_telepon);
            if (str_starts_with($phone, '0')) $phone = '62' . substr($phone, 1);
            $wa_url = "https://wa.me/{$phone}?text=" . urlencode($pesan);

            return redirect()->route('laporan.show', $laporan->id)
                ->with('success', 'Laporan telah ditolak.')
                ->with('wa_link', $wa_url);
        }

        // Jika Terima
        $request->validate([
            'sidang_etik_tanggal' => 'required|date',
            'sidang_etik_hari' => 'required|string',
            'sidang_etik_jam' => 'required|date_format:H:i',
            'pesan_pelapor' => 'required|string',
            'sidang_etik_detail' => 'required|string',
            'cek_plagiat_score' => 'required|integer|min:0|max:100',
            'rekomendasi_sanksi' => 'required|string',
        ]);

        TindakanPenilai::updateOrCreate(
            ['laporan_id' => $laporan->id],
            [
                'penilai_id' => $user->id,
                'sidang_etik_tanggal' => $request->sidang_etik_tanggal,
                'sidang_etik_hari' => $request->sidang_etik_hari,
                'sidang_etik_jam' => $request->sidang_etik_jam,
                'sidang_etik_detail' => $request->sidang_etik_detail,
                'cek_plagiat_score' => $request->cek_plagiat_score,
                'rekomendasi_sanksi' => $request->rekomendasi_sanksi,
            ]
        );

        // Move status to menunggu_rektor (Tim Penilai -> Rektor)
        $laporan->update(['status' => 'menunggu_rektor']);

        $tanggal_format = \Carbon\Carbon::parse($request->sidang_etik_tanggal)->format('d M Y');
        $pesan = "Halo {$laporan->pelapor_nama},\n\nLaporan dugaan Plagiarisme Anda (Kasus #K-".str_pad($laporan->id, 4, '0', STR_PAD_LEFT).") telah DITERIMA oleh Tim Penilai Ilmiah dan dijadwalkan untuk Sidang Etik.\n\nJadwal Sidang Etik:\nHari/Tanggal: {$request->sidang_etik_hari}, {$tanggal_format}\nWaktu: {$request->sidang_etik_jam} WIB\n\nPesan dari Tim Penilai Ilmiah:\n{$request->pesan_pelapor}\n\nTerima kasih.";
        $phone = preg_replace('/[^0-9]/', '', $laporan->no_telepon);
        if (str_starts_with($phone, '0')) $phone = '62' . substr($phone, 1);
        $wa_url = "https://wa.me/{$phone}?text=" . urlencode($pesan);

        return redirect()->route('laporan.show', $laporan->id)
            ->with('success', 'Sidang Etik berhasil dijadwalkan dan kasus diteruskan ke Rektor.')
            ->with('wa_link', $wa_url);
    }

    // 3. Psikolog Action
    public function psikologStore(Request $request, Laporan $laporan)
    {
        $user = Auth::user();
        if (!($user->isAdmin() || ($user->isPsikologRole() && $laporan->pts_nama === $user->pts_nama))) {
            abort(403, 'Akses khusus Admin atau Psikolog PTS yang bersangkutan.');
        }

        if ($laporan->status !== 'menunggu_psikolog') {
            if ($laporan->catatanKlinisPsikolog) {
                return back()->with('error', 'Laporan telah dijadwalkan / ditangani oleh Psikolog.');
            }
            return back()->with('error', 'Status laporan tidak berada dalam antrean Psikolog.');
        }

        $request->validate([
            'jadwal_tanggal' => 'required|date',
            'jadwal_hari' => 'required|string',
            'jadwal_jam' => 'required|string',
            'pesan_pelapor' => 'required|string',
            'sesi_konseling_online' => 'required|string|max:255',
        ]);

        CatatanKlinisPsikolog::updateOrCreate(
            ['laporan_id' => $laporan->id],
            [
                'psikolog_id' => $user->id,
                'jadwal_tanggal' => $request->jadwal_tanggal,
                'jadwal_hari' => $request->jadwal_hari,
                'jadwal_jam' => $request->jadwal_jam,
                'sesi_konseling_online' => $request->sesi_konseling_online,
            ]
        );

        // Generate WhatsApp Link
        $pesan_email = "Jadwal Konseling Laporan Anda (ID: #K-" . str_pad($laporan->id, 4, '0', STR_PAD_LEFT) . ")\n\n" .
                       "Tanggal: " . $request->jadwal_hari . ", " . \Carbon\Carbon::parse($request->jadwal_tanggal)->format('d M Y') . "\n" .
                       "Jam: " . $request->jadwal_jam . " WIB\n" .
                       "Lokasi / Link: " . $request->sesi_konseling_online . "\n\n" .
                       "Pesan: \n" . $request->pesan_pelapor;
                       
        $phone = preg_replace('/[^0-9]/', '', $laporan->no_telepon);
        if (str_starts_with($phone, '0')) $phone = '62' . substr($phone, 1);
        $wa_url = "https://wa.me/{$phone}?text=" . urlencode($pesan_email);

        return redirect()->route('laporan.show', $laporan->id)
            ->with('success', 'Jadwal konseling berhasil dikirim ke pelapor. Harap isi Catatan Klinis setelah konseling selesai.')
            ->with('wa_link', $wa_url);
    }

    public function psikologSelesai(Request $request, Laporan $laporan)
    {
        $user = Auth::user();
        if (!($user->isAdmin() || ($user->isPsikologRole() && $laporan->pts_nama === $user->pts_nama))) {
            abort(403, 'Akses khusus Admin atau Psikolog PTS yang bersangkutan.');
        }

        if ($laporan->status !== 'menunggu_psikolog') {
            if (in_array($laporan->status, ['menunggu_rektor', 'selesai', 'jalur_hukum'])) {
                return back()->with('error', 'Laporan telah selesai ditangani oleh Psikolog.');
            }
            return back()->with('error', 'Status laporan tidak berada dalam antrean Psikolog.');
        }

        $request->validate([
            'catatan_klinis' => 'required|string',
            'log_pemulihan' => 'required|string',
        ]);

        $catatan = CatatanKlinisPsikolog::where('laporan_id', $laporan->id)->firstOrFail();
        $catatan->update([
            'catatan_klinis' => $request->catatan_klinis,
            'log_pemulihan' => $request->log_pemulihan,
        ]);

        // Move status to menunggu_rektor (Psikolog -> Rektor)
        $laporan->update(['status' => 'menunggu_rektor']);

        return redirect()->route('laporan.show', $laporan->id)
            ->with('success', 'Catatan klinis berhasil disimpan dan kasus dilimpahkan ke Rektor.');
    }

    // 4. Rektor / Pimpinan PTS Action
    public function rektorStore(Request $request, Laporan $laporan)
    {
        $user = Auth::user();
        if (!($user->isAdmin() || ($user->isRektorRole() && $laporan->pts_nama === $user->pts_nama))) {
            abort(403, 'Akses khusus Admin atau Rektor / Pimpinan PTS yang bersangkutan.');
        }

        if ($laporan->status !== 'menunggu_rektor') {
            if ($laporan->eksekusiRektor) {
                return back()->with('error', 'Laporan telah dieksekusi oleh Rektor.');
            }
            return back()->with('error', 'Status laporan tidak berada dalam antrean Rektor.');
        }

        $request->validate([
            'sanksi_eksekusi' => 'required|string',
            'keputusan_rektor' => 'required|in:selesai,jalur_hukum',
            'catatan' => 'nullable|string',
            'file_bukti_selesai' => 'nullable|file|mimes:pdf,jpg,jpeg,png|max:5120',
        ]);

        $sanksi = $request->sanksi_eksekusi;
        $keterangan = "Kasus telah ditindaklanjuti dan kasus selesai.";
        
        if ($request->keputusan_rektor === 'jalur_hukum') {
            $sanksi = "[DITINDAKLANJUTI KE JALUR HUKUM]\n" . $sanksi;
            $keterangan = "Kasus ditindaklanjuti ke jalur hukum dan kasus internal selesai.";
        } else {
            $sanksi = "[SANKSI INTERNAL DITERAPKAN]\n" . $sanksi;
        }

        $filePath = null;
        if ($request->hasFile('file_bukti_selesai')) {
            $filePath = $request->file('file_bukti_selesai')->store('bukti_selesai', 'public');
        }

        EksekusiRektor::updateOrCreate(
            ['laporan_id' => $laporan->id],
            [
                'rektor_id' => $user->id,
                'sanksi_eksekusi' => $sanksi,
                'catatan' => $request->catatan,
                'file_bukti_selesai' => $filePath,
            ]
        );

        // Case finished
        $laporan->update([
            'status' => 'selesai',
            'deskripsi' => $laporan->deskripsi . "\n\n[KEPUTUSAN REKTOR]: " . $keterangan
        ]);

        return redirect()->route('laporan.show', $laporan->id)
            ->with('success', 'Sanksi berhasil dieksekusi. ' . $keterangan);
    }
}
