<?php

namespace App\Http\Controllers\Admin;

use App\Http\Controllers\Controller;
use App\Models\Buku;
use App\Models\MaklumatBukuDarjah;
use App\Models\User;
use Illuminate\Http\Request;

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

    public function pesanBuku(Request $request)
    {
        $tahun = (int) $request->query('tahun', date('Y'));
        $daerah = $request->query('daerah');
        $senarai_tahun = range(2026, 2040);
        $senarai_daerah = User::whereNotNull('daerah')->distinct()->orderBy('daerah')->pluck('daerah');

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

        $charts = $senaraiDarjah->map(function ($darjah) use ($daerah, $tahun) {
            $query = MaklumatBukuDarjah::where('tahun', $tahun)
                ->where('darjah', $darjah)
                ->whereIn('jenis_sekolah', ['SRA', 'SRAI', 'KAFAI']);

            if ($daerah) {
                $query->whereHas('user', function ($q) use ($daerah) {
                    $q->where('daerah', $daerah);
                });
            }

            $data = $query->selectRaw('kod_buku, judul, SUM(pesanan_buku) as total_pesanan')
                ->groupBy('kod_buku', 'judul')
                ->orderBy('kod_buku')
                ->get();

            return [
                'darjah' => $darjah,
                'labels' => $data->pluck('judul')->toArray(),
                'values' => $data->pluck('total_pesanan')->toArray(),
                'total'  => $data->sum('total_pesanan'),
            ];
        });

        return view('admin.laporan.pesan-buku', compact('charts', 'daerah', 'tahun', 'senarai_tahun', 'senarai_daerah'));
    }

    public function pesanBukuDetail(Request $request)
    {
        $tahun = (int) $request->query('tahun', date('Y'));
        $darjah = $request->query('darjah');
        $daerah = $request->query('daerah');
        $senarai_tahun = range(2026, 2040);
        $senarai_daerah = User::whereNotNull('daerah')->distinct()->orderBy('daerah')->pluck('daerah');

        $query = MaklumatBukuDarjah::with('user')
            ->where('tahun', $tahun)
            ->where('darjah', $darjah)
            ->whereIn('jenis_sekolah', ['SRA', 'SRAI', 'KAFAI'])
            ->where('pesanan_buku', '>', 0);

        if ($daerah) {
            $query->whereHas('user', function ($q) use ($daerah) {
                $q->where('daerah', $daerah);
            });
        }

        $senarai = $query->get()
            ->groupBy('user_id')
            ->map(function ($items) {
                $user = $items->first()->user;
                return [
                    'user'          => $user,
                    'buku'          => $items,
                    'total_pesanan' => $items->sum('pesanan_buku'),
                ];
            })
            ->sortBy(fn($item) => $item['user']->nama_sekolah)
            ->values();

        return view('admin.laporan.pesan-buku-detail', compact('senarai', 'daerah', 'tahun', 'darjah', 'senarai_tahun', 'senarai_daerah'));
    }

    public function pesanBukuCetak(Request $request)
    {
        $tahun = (int) $request->query('tahun', date('Y'));
        $daerah = $request->query('daerah');
        $senarai_daerah = $daerah
            ? collect([$daerah])
            : User::whereNotNull('daerah')->distinct()->orderBy('daerah')->pluck('daerah');

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

        // For each darjah, get pesanan per buku per daerah
        $tables = $senaraiDarjah->map(function ($darjah) use ($senarai_daerah, $tahun) {
            $bukuList = Buku::where('darjah', $darjah)->whereNull('jenis_sekolah')->orderBy('kod_buku')->get();

            $rows = $bukuList->map(function ($buku) use ($senarai_daerah, $darjah, $tahun) {
                $perDaerah = MaklumatBukuDarjah::where('maklumat_buku_darjah.tahun', $tahun)
                    ->where('maklumat_buku_darjah.darjah', $darjah)
                    ->where('maklumat_buku_darjah.kod_buku', $buku->kod_buku)
                    ->whereIn('maklumat_buku_darjah.jenis_sekolah', ['SRA', 'SRAI', 'KAFAI'])
                    ->join('users', 'users.id', '=', 'maklumat_buku_darjah.user_id')
                    ->selectRaw('users.daerah, SUM(maklumat_buku_darjah.pesanan_buku) as total')
                    ->groupBy('users.daerah')
                    ->pluck('total', 'daerah');

                $daerahValues = [];
                $rowTotal = 0;
                foreach ($senarai_daerah as $d) {
                    $val = (int) ($perDaerah[$d] ?? 0);
                    $daerahValues[$d] = $val;
                    $rowTotal += $val;
                }

                return [
                    'kod_buku' => $buku->kod_buku,
                    'judul'    => $buku->judul,
                    'daerah'   => $daerahValues,
                    'jumlah'   => $rowTotal,
                ];
            });

            // Column totals
            $colTotals = [];
            foreach ($senarai_daerah as $d) {
                $colTotals[$d] = $rows->sum(fn($r) => $r['daerah'][$d]);
            }
            $grandTotal = $rows->sum('jumlah');

            return [
                'darjah'     => $darjah,
                'rows'       => $rows,
                'colTotals'  => $colTotals,
                'grandTotal' => $grandTotal,
            ];
        });

        return view('admin.laporan.pesan-buku-cetak', compact('tables', 'senarai_daerah', 'tahun', 'daerah'));
    }

    public function lebihBuku(Request $request)
    {
        $tahun = (int) $request->query('tahun', date('Y'));
        $daerah = $request->query('daerah');
        $senarai_tahun = range(2026, 2040);
        $senarai_daerah = User::whereNotNull('daerah')->distinct()->orderBy('daerah')->pluck('daerah');

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

        $charts = $senaraiDarjah->map(function ($darjah) use ($daerah, $tahun) {
            $query = MaklumatBukuDarjah::where('tahun', $tahun)
                ->where('darjah', $darjah)
                ->whereIn('jenis_sekolah', ['SRA', 'SRAI', 'KAFAI']);

            if ($daerah) {
                $query->whereHas('user', function ($q) use ($daerah) {
                    $q->where('daerah', $daerah);
                });
            }

            $data = $query->selectRaw('kod_buku, judul, SUM(lebihan_buku) as total_lebihan')
                ->groupBy('kod_buku', 'judul')
                ->orderBy('kod_buku')
                ->get();

            return [
                'darjah'  => $darjah,
                'labels'  => $data->pluck('judul')->toArray(),
                'values'  => $data->pluck('total_lebihan')->map(fn($v) => max((int) $v, 0))->toArray(),
                'raw'     => $data->pluck('total_lebihan')->toArray(),
                'total'   => $data->sum('total_lebihan'),
            ];
        });

        return view('admin.laporan.lebih-buku', compact('charts', 'daerah', 'tahun', 'senarai_tahun', 'senarai_daerah'));
    }

    public function lebihBukuDetail(Request $request)
    {
        $tahun = (int) $request->query('tahun', date('Y'));
        $darjah = $request->query('darjah');
        $daerah = $request->query('daerah');
        $senarai_tahun = range(2026, 2040);
        $senarai_daerah = User::whereNotNull('daerah')->distinct()->orderBy('daerah')->pluck('daerah');

        $query = MaklumatBukuDarjah::with('user')
            ->where('tahun', $tahun)
            ->where('darjah', $darjah)
            ->whereIn('jenis_sekolah', ['SRA', 'SRAI', 'KAFAI']);

        if ($daerah) {
            $query->whereHas('user', function ($q) use ($daerah) {
                $q->where('daerah', $daerah);
            });
        }

        $senarai = $query->get()
            ->groupBy('user_id')
            ->map(function ($items) {
                $user = $items->first()->user;
                return [
                    'user'          => $user,
                    'buku'          => $items,
                    'total_lebihan' => $items->sum('lebihan_buku'),
                ];
            })
            ->filter(fn($item) => $item['total_lebihan'] != 0)
            ->sortBy(fn($item) => $item['user']->nama_sekolah)
            ->values();

        return view('admin.laporan.lebih-buku-detail', compact('senarai', 'daerah', 'tahun', 'darjah', 'senarai_tahun', 'senarai_daerah'));
    }

    public function lebihBukuCetak(Request $request)
    {
        $tahun = (int) $request->query('tahun', date('Y'));
        $daerah = $request->query('daerah');
        $senarai_daerah = $daerah
            ? collect([$daerah])
            : User::whereNotNull('daerah')->distinct()->orderBy('daerah')->pluck('daerah');

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

        $tables = $senaraiDarjah->map(function ($darjah) use ($senarai_daerah, $tahun) {
            $bukuList = Buku::where('darjah', $darjah)->whereNull('jenis_sekolah')->orderBy('kod_buku')->get();

            $rows = $bukuList->map(function ($buku) use ($senarai_daerah, $darjah, $tahun) {
                $perDaerah = MaklumatBukuDarjah::where('maklumat_buku_darjah.tahun', $tahun)
                    ->where('maklumat_buku_darjah.darjah', $darjah)
                    ->where('maklumat_buku_darjah.kod_buku', $buku->kod_buku)
                    ->whereIn('maklumat_buku_darjah.jenis_sekolah', ['SRA', 'SRAI', 'KAFAI'])
                    ->join('users', 'users.id', '=', 'maklumat_buku_darjah.user_id')
                    ->selectRaw('users.daerah, SUM(maklumat_buku_darjah.lebihan_buku) as total')
                    ->groupBy('users.daerah')
                    ->pluck('total', 'daerah');

                $daerahValues = [];
                $rowTotal = 0;
                foreach ($senarai_daerah as $d) {
                    $val = (int) ($perDaerah[$d] ?? 0);
                    $daerahValues[$d] = $val;
                    $rowTotal += $val;
                }

                return [
                    'kod_buku' => $buku->kod_buku,
                    'judul'    => $buku->judul,
                    'daerah'   => $daerahValues,
                    'jumlah'   => $rowTotal,
                ];
            });

            $colTotals = [];
            foreach ($senarai_daerah as $d) {
                $colTotals[$d] = $rows->sum(fn($r) => $r['daerah'][$d]);
            }
            $grandTotal = $rows->sum('jumlah');

            return [
                'darjah'     => $darjah,
                'rows'       => $rows,
                'colTotals'  => $colTotals,
                'grandTotal' => $grandTotal,
            ];
        });

        return view('admin.laporan.lebih-buku-cetak', compact('tables', 'senarai_daerah', 'tahun', 'daerah'));
    }

    public function bukuRosak(Request $request)
    {
        $tahun = (int) $request->query('tahun', date('Y'));
        $daerah = $request->query('daerah');
        $senarai_tahun = range(2026, 2040);
        $senarai_daerah = User::whereNotNull('daerah')->distinct()->orderBy('daerah')->pluck('daerah');

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

        $charts = $senaraiDarjah->map(function ($darjah) use ($daerah, $tahun) {
            $query = MaklumatBukuDarjah::where('tahun', $tahun)
                ->where('darjah', $darjah)
                ->whereIn('jenis_sekolah', ['SRA', 'SRAI', 'KAFAI']);

            if ($daerah) {
                $query->whereHas('user', function ($q) use ($daerah) {
                    $q->where('daerah', $daerah);
                });
            }

            $data = $query->selectRaw('kod_buku, judul, SUM(stok_hingga_akhir) as total_stok, SUM(elok_hingga_akhir) as total_elok')
                ->groupBy('kod_buku', 'judul')
                ->orderBy('kod_buku')
                ->get()
                ->map(function ($item) {
                    $item->total_rosak = max((int) $item->total_stok - (int) $item->total_elok, 0);
                    return $item;
                });

            return [
                'darjah' => $darjah,
                'labels' => $data->pluck('judul')->toArray(),
                'values' => $data->pluck('total_rosak')->toArray(),
                'stok'   => $data->pluck('total_stok')->toArray(),
                'elok'   => $data->pluck('total_elok')->toArray(),
                'total'  => $data->sum('total_rosak'),
            ];
        });

        return view('admin.laporan.buku-rosak', compact('charts', 'daerah', 'tahun', 'senarai_tahun', 'senarai_daerah'));
    }

    public function bukuRosakCetak(Request $request)
    {
        $tahun = (int) $request->query('tahun', date('Y'));
        $daerah = $request->query('daerah');
        $senarai_daerah = $daerah
            ? collect([$daerah])
            : User::whereNotNull('daerah')->distinct()->orderBy('daerah')->pluck('daerah');

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

        $tables = $senaraiDarjah->map(function ($darjah) use ($senarai_daerah, $tahun) {
            $bukuList = Buku::where('darjah', $darjah)->whereNull('jenis_sekolah')->orderBy('kod_buku')->get();

            $rows = $bukuList->map(function ($buku) use ($senarai_daerah, $darjah, $tahun) {
                $perDaerah = MaklumatBukuDarjah::where('maklumat_buku_darjah.tahun', $tahun)
                    ->where('maklumat_buku_darjah.darjah', $darjah)
                    ->where('maklumat_buku_darjah.kod_buku', $buku->kod_buku)
                    ->whereIn('maklumat_buku_darjah.jenis_sekolah', ['SRA', 'SRAI', 'KAFAI'])
                    ->join('users', 'users.id', '=', 'maklumat_buku_darjah.user_id')
                    ->selectRaw('users.daerah, SUM(GREATEST(CAST(maklumat_buku_darjah.stok_hingga_akhir AS SIGNED) - CAST(maklumat_buku_darjah.elok_hingga_akhir AS SIGNED), 0)) as total')
                    ->groupBy('users.daerah')
                    ->pluck('total', 'daerah');

                $daerahValues = [];
                $rowTotal = 0;
                foreach ($senarai_daerah as $d) {
                    $val = (int) ($perDaerah[$d] ?? 0);
                    $daerahValues[$d] = $val;
                    $rowTotal += $val;
                }

                return [
                    'kod_buku' => $buku->kod_buku,
                    'judul'    => $buku->judul,
                    'daerah'   => $daerahValues,
                    'jumlah'   => $rowTotal,
                ];
            });

            $colTotals = [];
            foreach ($senarai_daerah as $d) {
                $colTotals[$d] = $rows->sum(fn($r) => $r['daerah'][$d]);
            }
            $grandTotal = $rows->sum('jumlah');

            return [
                'darjah'     => $darjah,
                'rows'       => $rows,
                'colTotals'  => $colTotals,
                'grandTotal' => $grandTotal,
            ];
        });

        return view('admin.laporan.buku-rosak-cetak', compact('tables', 'senarai_daerah', 'tahun', 'daerah'));
    }

    // ── KKM (Kelas Kafa Menengah) Reports ──

    public function kkmPesanBuku(Request $request)
    {
        $tahun = (int) $request->query('tahun', date('Y'));
        $daerah = $request->query('daerah');
        $senarai_tahun = range(2026, 2040);
        $senarai_daerah = User::whereNotNull('daerah')->distinct()->orderBy('daerah')->pluck('daerah');

        $senaraiDarjah = Buku::distinct()->where('jenis_sekolah', 'KKM')->orderBy('darjah')->pluck('darjah');

        $charts = $senaraiDarjah->map(function ($darjah) use ($daerah, $tahun) {
            $query = MaklumatBukuDarjah::where('tahun', $tahun)
                ->where('darjah', $darjah)
                ->where('jenis_sekolah', 'KKM');

            if ($daerah) {
                $query->whereHas('user', function ($q) use ($daerah) {
                    $q->where('daerah', $daerah);
                });
            }

            $data = $query->selectRaw('kod_buku, judul, SUM(pesanan_buku) as total_pesanan')
                ->groupBy('kod_buku', 'judul')
                ->orderBy('kod_buku')
                ->get();

            return [
                'darjah' => $darjah,
                'labels' => $data->pluck('judul')->toArray(),
                'values' => $data->pluck('total_pesanan')->toArray(),
                'total'  => $data->sum('total_pesanan'),
            ];
        });

        return view('admin.laporan.kkm-pesan-buku', compact('charts', 'daerah', 'tahun', 'senarai_tahun', 'senarai_daerah'));
    }

    public function kkmPesanBukuCetak(Request $request)
    {
        $tahun = (int) $request->query('tahun', date('Y'));
        $daerah = $request->query('daerah');
        $senarai_daerah = $daerah
            ? collect([$daerah])
            : User::whereNotNull('daerah')->distinct()->orderBy('daerah')->pluck('daerah');

        $senaraiDarjah = Buku::distinct()->where('jenis_sekolah', 'KKM')->orderBy('darjah')->pluck('darjah');

        $tables = $senaraiDarjah->map(function ($darjah) use ($senarai_daerah, $tahun) {
            $bukuList = Buku::where('darjah', $darjah)->where('jenis_sekolah', 'KKM')->orderBy('kod_buku')->get();

            $rows = $bukuList->map(function ($buku) use ($senarai_daerah, $darjah, $tahun) {
                $perDaerah = MaklumatBukuDarjah::where('maklumat_buku_darjah.tahun', $tahun)
                    ->where('maklumat_buku_darjah.darjah', $darjah)
                    ->where('maklumat_buku_darjah.kod_buku', $buku->kod_buku)
                    ->where('maklumat_buku_darjah.jenis_sekolah', 'KKM')
                    ->join('users', 'users.id', '=', 'maklumat_buku_darjah.user_id')
                    ->selectRaw('users.daerah, SUM(maklumat_buku_darjah.pesanan_buku) as total')
                    ->groupBy('users.daerah')
                    ->pluck('total', 'daerah');

                $daerahValues = [];
                $rowTotal = 0;
                foreach ($senarai_daerah as $d) {
                    $val = (int) ($perDaerah[$d] ?? 0);
                    $daerahValues[$d] = $val;
                    $rowTotal += $val;
                }

                return [
                    'kod_buku' => $buku->kod_buku,
                    'judul'    => $buku->judul,
                    'daerah'   => $daerahValues,
                    'jumlah'   => $rowTotal,
                ];
            });

            $colTotals = [];
            foreach ($senarai_daerah as $d) {
                $colTotals[$d] = $rows->sum(fn($r) => $r['daerah'][$d]);
            }
            $grandTotal = $rows->sum('jumlah');

            return [
                'darjah'     => $darjah,
                'rows'       => $rows,
                'colTotals'  => $colTotals,
                'grandTotal' => $grandTotal,
            ];
        });

        return view('admin.laporan.kkm-pesan-buku-cetak', compact('tables', 'senarai_daerah', 'tahun', 'daerah'));
    }

    public function kkmLebihBuku(Request $request)
    {
        $tahun = (int) $request->query('tahun', date('Y'));
        $daerah = $request->query('daerah');
        $senarai_tahun = range(2026, 2040);
        $senarai_daerah = User::whereNotNull('daerah')->distinct()->orderBy('daerah')->pluck('daerah');

        $senaraiDarjah = Buku::distinct()->where('jenis_sekolah', 'KKM')->orderBy('darjah')->pluck('darjah');

        $charts = $senaraiDarjah->map(function ($darjah) use ($daerah, $tahun) {
            $query = MaklumatBukuDarjah::where('tahun', $tahun)
                ->where('darjah', $darjah)
                ->where('jenis_sekolah', 'KKM');

            if ($daerah) {
                $query->whereHas('user', function ($q) use ($daerah) {
                    $q->where('daerah', $daerah);
                });
            }

            $data = $query->selectRaw('kod_buku, judul, SUM(lebihan_buku) as total_lebihan')
                ->groupBy('kod_buku', 'judul')
                ->orderBy('kod_buku')
                ->get();

            return [
                'darjah'  => $darjah,
                'labels'  => $data->pluck('judul')->toArray(),
                'values'  => $data->pluck('total_lebihan')->map(fn($v) => max((int) $v, 0))->toArray(),
                'raw'     => $data->pluck('total_lebihan')->toArray(),
                'total'   => $data->sum('total_lebihan'),
            ];
        });

        return view('admin.laporan.kkm-lebih-buku', compact('charts', 'daerah', 'tahun', 'senarai_tahun', 'senarai_daerah'));
    }

    public function kkmLebihBukuCetak(Request $request)
    {
        $tahun = (int) $request->query('tahun', date('Y'));
        $daerah = $request->query('daerah');
        $senarai_daerah = $daerah
            ? collect([$daerah])
            : User::whereNotNull('daerah')->distinct()->orderBy('daerah')->pluck('daerah');

        $senaraiDarjah = Buku::distinct()->where('jenis_sekolah', 'KKM')->orderBy('darjah')->pluck('darjah');

        $tables = $senaraiDarjah->map(function ($darjah) use ($senarai_daerah, $tahun) {
            $bukuList = Buku::where('darjah', $darjah)->where('jenis_sekolah', 'KKM')->orderBy('kod_buku')->get();

            $rows = $bukuList->map(function ($buku) use ($senarai_daerah, $darjah, $tahun) {
                $perDaerah = MaklumatBukuDarjah::where('maklumat_buku_darjah.tahun', $tahun)
                    ->where('maklumat_buku_darjah.darjah', $darjah)
                    ->where('maklumat_buku_darjah.kod_buku', $buku->kod_buku)
                    ->where('maklumat_buku_darjah.jenis_sekolah', 'KKM')
                    ->join('users', 'users.id', '=', 'maklumat_buku_darjah.user_id')
                    ->selectRaw('users.daerah, SUM(maklumat_buku_darjah.lebihan_buku) as total')
                    ->groupBy('users.daerah')
                    ->pluck('total', 'daerah');

                $daerahValues = [];
                $rowTotal = 0;
                foreach ($senarai_daerah as $d) {
                    $val = (int) ($perDaerah[$d] ?? 0);
                    $daerahValues[$d] = $val;
                    $rowTotal += $val;
                }

                return [
                    'kod_buku' => $buku->kod_buku,
                    'judul'    => $buku->judul,
                    'daerah'   => $daerahValues,
                    'jumlah'   => $rowTotal,
                ];
            });

            $colTotals = [];
            foreach ($senarai_daerah as $d) {
                $colTotals[$d] = $rows->sum(fn($r) => $r['daerah'][$d]);
            }
            $grandTotal = $rows->sum('jumlah');

            return [
                'darjah'     => $darjah,
                'rows'       => $rows,
                'colTotals'  => $colTotals,
                'grandTotal' => $grandTotal,
            ];
        });

        return view('admin.laporan.kkm-lebih-buku-cetak', compact('tables', 'senarai_daerah', 'tahun', 'daerah'));
    }

    public function kkmBukuRosak(Request $request)
    {
        $tahun = (int) $request->query('tahun', date('Y'));
        $daerah = $request->query('daerah');
        $senarai_tahun = range(2026, 2040);
        $senarai_daerah = User::whereNotNull('daerah')->distinct()->orderBy('daerah')->pluck('daerah');

        $senaraiDarjah = Buku::distinct()->where('jenis_sekolah', 'KKM')->orderBy('darjah')->pluck('darjah');

        $charts = $senaraiDarjah->map(function ($darjah) use ($daerah, $tahun) {
            $query = MaklumatBukuDarjah::where('tahun', $tahun)
                ->where('darjah', $darjah)
                ->where('jenis_sekolah', 'KKM');

            if ($daerah) {
                $query->whereHas('user', function ($q) use ($daerah) {
                    $q->where('daerah', $daerah);
                });
            }

            $data = $query->selectRaw('kod_buku, judul, SUM(stok_hingga_akhir) as total_stok, SUM(elok_hingga_akhir) as total_elok')
                ->groupBy('kod_buku', 'judul')
                ->orderBy('kod_buku')
                ->get()
                ->map(function ($item) {
                    $item->total_rosak = max((int) $item->total_stok - (int) $item->total_elok, 0);
                    return $item;
                });

            return [
                'darjah' => $darjah,
                'labels' => $data->pluck('judul')->toArray(),
                'values' => $data->pluck('total_rosak')->toArray(),
                'stok'   => $data->pluck('total_stok')->toArray(),
                'elok'   => $data->pluck('total_elok')->toArray(),
                'total'  => $data->sum('total_rosak'),
            ];
        });

        return view('admin.laporan.kkm-buku-rosak', compact('charts', 'daerah', 'tahun', 'senarai_tahun', 'senarai_daerah'));
    }

    public function kkmBukuRosakCetak(Request $request)
    {
        $tahun = (int) $request->query('tahun', date('Y'));
        $daerah = $request->query('daerah');
        $senarai_daerah = $daerah
            ? collect([$daerah])
            : User::whereNotNull('daerah')->distinct()->orderBy('daerah')->pluck('daerah');

        $senaraiDarjah = Buku::distinct()->where('jenis_sekolah', 'KKM')->orderBy('darjah')->pluck('darjah');

        $tables = $senaraiDarjah->map(function ($darjah) use ($senarai_daerah, $tahun) {
            $bukuList = Buku::where('darjah', $darjah)->where('jenis_sekolah', 'KKM')->orderBy('kod_buku')->get();

            $rows = $bukuList->map(function ($buku) use ($senarai_daerah, $darjah, $tahun) {
                $perDaerah = MaklumatBukuDarjah::where('maklumat_buku_darjah.tahun', $tahun)
                    ->where('maklumat_buku_darjah.darjah', $darjah)
                    ->where('maklumat_buku_darjah.kod_buku', $buku->kod_buku)
                    ->where('maklumat_buku_darjah.jenis_sekolah', 'KKM')
                    ->join('users', 'users.id', '=', 'maklumat_buku_darjah.user_id')
                    ->selectRaw('users.daerah, SUM(GREATEST(CAST(maklumat_buku_darjah.stok_hingga_akhir AS SIGNED) - CAST(maklumat_buku_darjah.elok_hingga_akhir AS SIGNED), 0)) as total')
                    ->groupBy('users.daerah')
                    ->pluck('total', 'daerah');

                $daerahValues = [];
                $rowTotal = 0;
                foreach ($senarai_daerah as $d) {
                    $val = (int) ($perDaerah[$d] ?? 0);
                    $daerahValues[$d] = $val;
                    $rowTotal += $val;
                }

                return [
                    'kod_buku' => $buku->kod_buku,
                    'judul'    => $buku->judul,
                    'daerah'   => $daerahValues,
                    'jumlah'   => $rowTotal,
                ];
            });

            $colTotals = [];
            foreach ($senarai_daerah as $d) {
                $colTotals[$d] = $rows->sum(fn($r) => $r['daerah'][$d]);
            }
            $grandTotal = $rows->sum('jumlah');

            return [
                'darjah'     => $darjah,
                'rows'       => $rows,
                'colTotals'  => $colTotals,
                'grandTotal' => $grandTotal,
            ];
        });

        return view('admin.laporan.kkm-buku-rosak-cetak', compact('tables', 'senarai_daerah', 'tahun', 'daerah'));
    }
}
