<?php

namespace App\Http\Controllers\Admin;

use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
use App\Models\User;
use App\Models\Anggota; 
use App\Models\Koleksi;
use App\Models\BorrowTransaction;
use App\Models\Rating; 
use Illuminate\Support\Facades\DB;

class DashboardController extends Controller
{
    public function index()
    {
        // 1. Menghitung Data Dasar Koleksi
        $jumlahJudul = Koleksi::distinct('title')->count('title');
        $jumlahEksemplar = Koleksi::whereNotNull('kode_eksemplar')->count();
        $jumlahUser = User::count();

        $totalBuku = $jumlahJudul;
        $totalAnggota = Anggota::count();

        // 2. Statistik Anggota & Sirkulasi
        $anggotaBulanIni = Anggota::whereMonth('created_at', date('m'))->count();
        
        // Menghitung buku yang sedang aktif dipinjam
        $totalPeminjaman = BorrowTransaction::where('status', 'dipinjam')->count();

        /** 
         * UPDATE: Menghitung total pengembalian. 
         * Menggunakan status 'kembali' atau 'dikembalikan' agar sinkron dengan database
         */
        $totalPengembalian = BorrowTransaction::whereIn('status', ['kembali', 'dikembalikan'])->count();

        // 3. Menghitung Notifikasi (PENGECEKAN KETAT)
        $pendingMembers = Anggota::whereIn('status', ['pending', 'menunggu'])->count();
        
        /** 
         * UPDATE: Notifikasi Peminjaman/Pengembalian Baru
         * Menghitung transaksi yang statusnya 'menunggu' (pinjam baru), 
         * 'pengembalian_menunggu' (user lapor sudah mengembalikan), 
         * dan 'perpanjangan_menunggu' (user minta perpanjang).
         */
        $pendingLoans = BorrowTransaction::whereIn('status', [
            'menunggu', 
            'pengembalian_menunggu', 
            'perpanjangan_menunggu'
        ])->count();

        // 4. Data Chart (Sirkulasi Peminjaman Bulanan)
        $chartData = BorrowTransaction::selectRaw('MONTH(tanggal_pinjam) as bulan, COUNT(*) as total')
            ->whereYear('tanggal_pinjam', date('Y'))
            ->groupBy('bulan')
            ->orderBy('bulan')
            ->pluck('total', 'bulan')
            ->toArray();

        $chartDataFull = [];
        for ($i = 1; $i <= 12; $i++) {
            $chartDataFull[] = $chartData[$i] ?? 0;
        }

        $bulanLabel = ['Jan', 'Feb', 'Mar', 'Apr', 'Mei', 'Jun', 'Jul', 'Agu', 'Sep', 'Okt', 'Nov', 'Des'];

        // 5. Rating & Feedback
        $ratings = Rating::with(['user', 'transaction.koleksi'])
            ->orderBy('created_at', 'desc')
            ->take(10)
            ->get();

        // 6. Buku Terpopuler
        $mostBorrowedBook = BorrowTransaction::select('koleksi_id')
            ->selectRaw('COUNT(*) as total')
            ->groupBy('koleksi_id')
            ->orderByDesc('total')
            ->with('koleksi')
            ->first();

        // 7. Return ke View
        return view('admin.dashboard', compact(
            'jumlahJudul',
            'jumlahEksemplar',
            'jumlahUser',
            'totalBuku',
            'totalAnggota',
            'anggotaBulanIni', 
            'totalPeminjaman',
            'totalPengembalian',
            'pendingMembers', 
            'pendingLoans',   
            'chartDataFull',
            'bulanLabel',
            'ratings',
            'mostBorrowedBook'
        ));
    }

    // TURUNKAN ADMIN MENJADI USER
    public function turunkanAdmin($id)
    {
        $auth = Auth::user();

        if (!$auth || $auth->role !== 'super_admin') {
            abort(403, 'Akses ditolak!');
        }

        $user = User::findOrFail($id);

        $user->role = 'user';
        $user->save();

        return back()->with(
            'success',
            'Admin berhasil dijadikan user.'
        );
    }

    // BLOKIR USER
    public function blokirUser($id)
    {
        $auth = Auth::user();

        if (!$auth || $auth->role !== 'super_admin') {
            abort(403, 'Akses ditolak!');
        }

        $user = User::findOrFail($id);

        $user->blocked_at = now();
        $user->save();

        return back()->with(
            'success',
            'User berhasil diblokir.'
        );
    }
}

