<?php

namespace App\Http\Controllers\Siswa;

use App\Http\Controllers\Controller;
use Illuminate\Support\Facades\Auth;
use Carbon\Carbon;

use App\Models\Tugas;
use App\Models\PengumpulanTugas;
use App\Models\Challenge;
use App\Models\PesertaChallenge;
use App\Models\Leaderboard;
use App\Models\Siswa;

class DashboardController extends Controller
{
    public function __construct()
    {
        $this->middleware('auth:siswa');
    }

    public function index()
    {
        /** @var \App\Models\Siswa $siswa */
        $siswa = Auth::guard('siswa')->user();

        // =============================================
        // 1. TUGAS — yang belum dikumpulkan siswa ini
        //    dan deadline belum lewat
        // =============================================

        // id_tugas yang sudah dikumpulkan siswa ini
        $sudahDikumpulkan = PengumpulanTugas::where('id_siswa', $siswa->id_siswa)
            ->pluck('id_tugas');

        // Tugas untuk kelas siswa yang belum dikumpulkan
        $tugasRaw = Tugas::with(['mengajar.mapel'])
            ->whereNotIn('id_tugas', $sudahDikumpulkan)
            ->where('deadline', '>=', Carbon::now())
            ->whereHas('mengajar', function ($q) use ($siswa) {
                $q->where('id_kelas', $siswa->id_kelas);
            })
            ->orderBy('deadline', 'asc')
            ->take(5)
            ->get();

        // Kelompokkan per tanggal deadline
        $tugasList = [];
        foreach ($tugasRaw as $tugas) {
            $tgl = Carbon::parse($tugas->deadline)
                ->locale('id')
                ->isoFormat('dddd, D MMMM YYYY');

            $namaMapel = optional(optional($tugas->mengajar)->mapel)->nama_mapel ?? '-';

            $tugasList[$tgl][] = [
                'jam'   => Carbon::parse($tugas->deadline)->format('H.i'),
                'nama'  => $tugas->judul_tugas,
                'mapel' => 'Belum · ' . $namaMapel,
            ];
        }

        // =============================================
        // 2. CHALLENGE MINGGUAN
        // =============================================
        $startMinggu = Carbon::now()->startOfWeek();
        $endMinggu   = Carbon::now()->endOfWeek();

        // Challenge untuk kelas siswa yang masih aktif minggu ini
        $challengeTotal = Challenge::whereHas('kelas', function ($q) use ($siswa) {
                $q->where('challenge_kelas.id_kelas', $siswa->id_kelas);
            })
            ->where('tenggat_waktu', '>=', Carbon::now())
            ->whereBetween('created_at', [$startMinggu, $endMinggu])
            ->count();

        // Challenge yang sudah selesai dikerjakan siswa minggu ini
        $challengeDone = PesertaChallenge::where('id_siswa', $siswa->id_siswa)
            ->where('status', 'selesai')
            ->whereBetween('waktu_submit', [$startMinggu, $endMinggu])
            ->count();

        // =============================================
        // 3. TUGAS SELESAI MINGGU INI (mascot speech bubble)
        // =============================================
        $tugasSelesai = PengumpulanTugas::where('id_siswa', $siswa->id_siswa)
            ->whereIn('status', ['dikumpulkan', 'terlambat'])
            ->whereBetween('tanggal_submit', [$startMinggu, $endMinggu])
            ->count();

        // =============================================
        // 4. LEADERBOARD — top 3 kelas siswa yang login
        // =============================================
        $leaderboardRaw = Leaderboard::with('siswa')
            ->where('id_kelas', $siswa->id_kelas)
            ->orderBy('total_exp', 'desc')
            ->take(3)
            ->get();

        $leaderboard = $leaderboardRaw->map(function ($item, $index) {
            return [
                'rank' => $index + 1,
                'nama' => optional($item->siswa)->nama ?? '-',
                'exp'  => $item->total_exp,
            ];
        })->toArray();

        return view('siswa.dashboard', compact(
            'tugasList',
            'challengeDone',
            'challengeTotal',
            'tugasSelesai',
            'leaderboard',
        ));
    }
}