<?php

namespace App\Http\Controllers\Supervisor;

use App\Http\Controllers\Controller;
use App\Models\Buku;
use App\Models\Iklan;
use App\Models\JenisSekolah;
use App\Models\MaklumatBukuDarjah;
use App\Models\Pengesahan;
use App\Models\User;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;

class DashboardController extends Controller
{
    public function __construct()
    {
        $this->middleware(['auth', 'role:supervisor']);
    }

    public function index(Request $request)
    {
        $supervisor = Auth::user();
        $daerah = $supervisor->daerah;
        $tahunSemasa = (int) date('Y');
        $tahun = (int) $request->query('tahun', $tahunSemasa);
        $senarai_tahun = range(2026, 2040);

        $jenisSekolahList = JenisSekolah::all();

        // Kira pemohon mengikut jenis sekolah dalam daerah yang sama
        $cards = $jenisSekolahList->map(function ($jenisSekolah) use ($daerah, $tahun, $tahunSemasa) {
            $jenis = $jenisSekolah->nama_jenis;
            $kodJenis = $jenisSekolah->kod_jenis;

            // Jumlah sekolah unik dalam daerah & jenis sekolah
            $jumlahSekolah = User::where('daerah', $daerah)
                ->whereJsonContains('jenis_sekolah', $jenis)
                ->whereNotNull('kod_sekolah')
                ->distinct('kod_sekolah')
                ->count('kod_sekolah');

            // Jumlah pemohon
            $jumlahPemohon = User::where('role', 'pemohon')
                ->where('daerah', $daerah)
                ->whereJsonContains('jenis_sekolah', $jenis)
                ->count();

            // Jika tahun masa depan, tiada data lagi
            if ($tahun > $tahunSemasa) {
                return [
                    'jenis'          => $jenis,
                    'kod_jenis'      => $jenisSekolah->kod_jenis,
                    'penerangan'     => $jenisSekolah->penerangan,
                    'jumlah_sekolah' => $jumlahSekolah,
                    'jumlah_pemohon' => $jumlahPemohon,
                    'lulus'          => 0,
                    'ditolak'        => 0,
                    'belum_semak'    => 0,
                    'belum_hantar'   => 0,
                ];
            }

            // Pengesahan mengikut status — tapis berdasarkan jenis_sekolah pada rekod pengesahan
            $basePengesahan = Pengesahan::where('tahun', $tahun)
                ->where('jenis_sekolah', $jenis)
                ->whereHas('user', function ($q) use ($daerah) {
                    $q->where('daerah', $daerah);
                });

            $lulus = (clone $basePengesahan)->where('status', 'lulus')->count();
            $ditolak = (clone $basePengesahan)->where('status', 'ditolak')->count();
            $belumSemak = (clone $basePengesahan)->where('status', 'belum_semak')->count();

            // Belum hantar = pemohon yang tiada pengesahan untuk jenis sekolah ini
            $sudahHantar = (clone $basePengesahan)->count();
            $belumHantar = $jumlahPemohon - $sudahHantar;

            return [
                'jenis'          => $jenis,
                'kod_jenis'      => $jenisSekolah->kod_jenis,
                'penerangan'     => $jenisSekolah->penerangan,
                'jumlah_sekolah' => $jumlahSekolah,
                'jumlah_pemohon' => $jumlahPemohon,
                'lulus'          => $lulus,
                'ditolak'        => $ditolak,
                'belum_semak'    => $belumSemak,
                'belum_hantar'   => max($belumHantar, 0),
            ];
        });

        $iklanList = Iklan::where('is_aktif', true)
            ->where(function ($q) {
                $q->whereJsonContains('target_role', 'supervisor')
                  ->orWhereJsonContains('target_role', 'semua');
            })
            ->where('tarikh_mula', '<=', now())
            ->where(function ($q) {
                $q->whereNull('tarikh_tamat')
                  ->orWhere('tarikh_tamat', '>=', now());
            })
            ->latest()
            ->get();

        // Statistik agregat untuk small-box
        $stats = [
            'jumlah_sekolah' => $cards->sum('jumlah_sekolah'),
            'lulus'          => $cards->sum('lulus'),
            'ditolak'        => $cards->sum('ditolak'),
            'belum_semak'    => $cards->sum('belum_semak'),
            'belum_hantar'   => $cards->sum('belum_hantar'),
        ];

        return view('supervisor.dashboard', compact('cards', 'daerah', 'tahun', 'senarai_tahun', 'iklanList', 'stats'));
    }

    public function senarai(Request $request)
    {
        $supervisor = Auth::user();
        $daerah = $supervisor->daerah;
        $tahun = (int) $request->query('tahun', date('Y'));
        $kodJenis = $request->query('kod_jenis');
        $status = $request->query('status', 'semua');

        $jenisSekolah = null;
        $matchJenis = null;
        if ($kodJenis) {
            $jenisSekolah = JenisSekolah::where('kod_jenis', $kodJenis)->firstOrFail();
            $matchJenis = $jenisSekolah->nama_jenis;
        }

        if ($status === 'semua' || $status === 'belum_hantar') {
            $userQuery = User::where('role', 'pemohon')->where('daerah', $daerah);
            if ($matchJenis) {
                $userQuery->whereJsonContains('jenis_sekolah', $matchJenis);
            }
            if ($status === 'belum_hantar') {
                // Cari pemohon yang belum hantar pengesahan untuk jenis sekolah ini
                $sudahHantarQuery = Pengesahan::where('tahun', $tahun)
                    ->whereHas('user', function ($q) use ($daerah) {
                        $q->where('daerah', $daerah);
                    });
                if ($matchJenis) {
                    $sudahHantarQuery->where('jenis_sekolah', $matchJenis);
                }
                $sudahHantarIds = $sudahHantarQuery->pluck('user_id');
                $userQuery->whereNotIn('id', $sudahHantarIds);
            }
            $senarai = $userQuery->get();
            $tajuk = $status === 'semua' ? 'Semua Sekolah' : 'Belum Hantar';
            $badgeClass = $status === 'semua' ? 'secondary' : 'warning';
        } else {
            $pengesahanQuery = Pengesahan::with(['user', 'checker'])
                ->where('tahun', $tahun)
                ->where('status', $status)
                ->whereHas('user', function ($q) use ($daerah) {
                    $q->where('daerah', $daerah);
                });
            if ($matchJenis) {
                $pengesahanQuery->where('jenis_sekolah', $matchJenis);
            }
            $senarai = $pengesahanQuery->latest('disemak_pada')->get();
            $tajuk = $status === 'lulus' ? 'Lulus' : ($status === 'belum_semak' ? 'Belum Semak' : 'Ditolak');
            $badgeClass = $status === 'lulus' ? 'success' : ($status === 'belum_semak' ? 'primary' : 'danger');
        }

        return view('supervisor.senarai', compact('senarai', 'jenisSekolah', 'daerah', 'tahun', 'status', 'tajuk', 'badgeClass'));
    }

    public function lihatBuku(User $user)
    {
        $supervisor = Auth::user();

        // Pastikan user dalam daerah yang sama
        if ($user->daerah !== $supervisor->daerah) {
            abort(403, 'Akses tidak dibenarkan.');
        }

        $tahun = (int) date('Y');

        $filterDarjah = request()->query('darjah');
        $senaraiDarjah = Buku::distinct()->orderBy('darjah')->pluck('darjah');

        if ($filterDarjah) {
            $senaraiDarjah = $senaraiDarjah->filter(fn($d) => $d === $filterDarjah)->values();
        }

        $data = $senaraiDarjah->map(function ($darjah) use ($user, $tahun) {
            $maklumat = MaklumatBukuDarjah::where('user_id', $user->id)
                ->where('tahun', $tahun)
                ->where('darjah', $darjah)
                ->get();

            return [
                'darjah'   => $darjah,
                'maklumat' => $maklumat,
                'selesai'  => $maklumat->isNotEmpty(),
            ];
        });

        // Dari senarai-sekolah: hanya papar darjah yang ada pesanan > 0
        $from = request()->query('from');
        if ($from === 'senarai-sekolah') {
            $data = $data->filter(function ($item) {
                return $item['maklumat']->sum('pesanan_buku') > 0;
            })->values();
        }

        // Dari senarai-sekolah-lebihan: hanya papar darjah yang ada lebihan != 0
        if ($from === 'senarai-sekolah-lebihan') {
            $data = $data->filter(function ($item) {
                return $item['maklumat']->sum('lebihan_buku') != 0;
            })->values();
        }

        $kodJenis = is_array($user->jenis_sekolah) ? implode(', ', $user->jenis_sekolah) : $user->jenis_sekolah;
        $status = request()->query('status');
        $from = request()->query('from');

        return view('supervisor.lihat-buku', compact('user', 'data', 'tahun', 'kodJenis', 'status', 'from', 'filterDarjah'));
    }

    public function lihatBukuCetak(User $user)
    {
        $supervisor = Auth::user();

        if ($user->daerah !== $supervisor->daerah) {
            abort(403, 'Akses tidak dibenarkan.');
        }

        $tahun = (int) date('Y');
        $filterDarjah = request()->query('darjah');
        $from = request()->query('from');

        $senaraiDarjah = Buku::distinct()->orderBy('darjah')->pluck('darjah');

        if ($filterDarjah) {
            $senaraiDarjah = $senaraiDarjah->filter(fn($d) => $d === $filterDarjah)->values();
        }

        $data = $senaraiDarjah->map(function ($darjah) use ($user, $tahun) {
            $maklumat = MaklumatBukuDarjah::where('user_id', $user->id)
                ->where('tahun', $tahun)
                ->where('darjah', $darjah)
                ->get();

            return [
                'darjah'   => $darjah,
                'maklumat' => $maklumat,
                'selesai'  => $maklumat->isNotEmpty(),
            ];
        });

        if ($from === 'senarai-sekolah') {
            $data = $data->filter(fn($item) => $item['maklumat']->sum('pesanan_buku') > 0)->values();
        }
        if ($from === 'senarai-sekolah-lebihan') {
            $data = $data->filter(fn($item) => $item['maklumat']->sum('lebihan_buku') != 0)->values();
        }

        return view('supervisor.lihat-buku-cetak', compact('user', 'data', 'tahun', 'supervisor', 'from'));
    }
}
