<?php

namespace App\Http\Controllers\Mahasiswa;

use Inertia\Inertia;
use App\Models\Absensi;
use App\Models\AbsensiSession;
use App\Models\JadwalKuliah;
use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
use App\Models\Krs;
use App\Models\Pembayaran;
use App\Models\TahunAkademik;
use Illuminate\Support\Facades\Auth;

class MahasiswaController extends Controller
{
    public function index()
    {
        $mahasiswa = Auth::user()->mahasiswa;
        $tahunAkademik = TahunAkademik::where('is_aktif', true)->first();
        $biayaKuliah = 2500000;

        $krsSemester = Krs::with('details.jadwalKuliah.mataKuliah')
            ->where('mahasiswa_id', $mahasiswa->id)
            ->where('tahun_akademik_id', $tahunAkademik?->id)
            ->first();

        $sksSemester = $krsSemester
            ? $krsSemester->details->sum(fn($d) => $d->jadwalKuliah?->mataKuliah?->sks ?? 0)
            : 0;

        $allKrs = Krs::with('details.jadwalKuliah.mataKuliah')
            ->where('mahasiswa_id', $mahasiswa->id)
            ->get();

        $totalSks = $allKrs->sum(function ($krs) {
            return $krs->details->sum(fn($d) => $d->jadwalKuliah?->mataKuliah?->sks ?? 0);
        });

        $totalDibayar = Pembayaran::where('mahasiswa_id', $mahasiswa->id)
            ->where('tahun_akademik_id', $tahunAkademik?->id)
            ->where('status', 'valid')
            ->sum('nominal');

        return Inertia::render('Mahasiswa/Dashboard', [
            'tahunAkademik' => $tahunAkademik?->nama ?? '-',
            'sksSemester' => $sksSemester,
            'totalSks' => $totalSks,
            'biayaKuliah' => $biayaKuliah,
            'totalDibayar' => $totalDibayar,
        ]);
    }

    public function absensiMahasiswa()
    {
        $mahasiswa = auth()->user()->mahasiswa;

        $tahunAkademik = TahunAkademik::where('is_aktif', true)->first();

        $krsDetails = $mahasiswa->krsDetails()
            ->whereHas('jadwalKuliah', function ($q) use ($tahunAkademik) {
                $q->where('tahun_akademik_id', $tahunAkademik->id);
            })
            ->with(['jadwalKuliah.mataKuliah', 'jadwalKuliah.dosen.user', 'jadwalKuliah.absensis'])
            ->get();

        $absensiData = $krsDetails->map(function ($detail) use ($mahasiswa) {
            $jadwal = $detail->jadwalKuliah;

            $absensis = $jadwal->absensis()
                ->where('mahasiswa_id', $mahasiswa->id)
                ->get();

            $jam_mulai = date('H.i', strtotime($jadwal->jam_mulai));
            $jam_selesai = date('H.i', strtotime($jadwal->jam_selesai));

            return [
                'jadwal_id'    => $jadwal->id,
                'kode_mk'      => $jadwal->mataKuliah->kode,
                'nama_mk'      => $jadwal->mataKuliah->nama,
                'dosen'        => $jadwal->dosen->user->name ?? '-',
                'hari'         => $jadwal->hari . ' / ' . $jam_mulai . '-' . $jam_selesai,
                'hadir'        => $absensis->where('status', 'hadir')->count(),
                'izin'         => $absensis->where('status', 'izin')->count(),
                'sakit'        => $absensis->where('status', 'sakit')->count(),
                'alpha'        => $absensis->where('status', 'alpha')->count(),
            ];
        });

        return inertia('Mahasiswa/Absensi', [
            'absensis' => $absensiData,
        ]);
    }

    public function detailAbsensi($jadwal)
    {
        $mahasiswa = auth()->user()->mahasiswa;

        $jadwalKuliah = JadwalKuliah::with(['mataKuliah', 'dosen.user'])
            ->findOrFail($jadwal);

        $absensis = $jadwalKuliah->absensis()
            ->where('mahasiswa_id', $mahasiswa->id)
            ->get()
            ->map(fn($a) => [
                'pertemuan' => $a->pertemuan,
                'tanggal' => $a->tanggal,
                'status' => $a->status,
                'keterangan' => $a->keterangan,
            ]);

        return inertia('Mahasiswa/AbsensiDetail', [
            'mata_kuliah' => $jadwalKuliah->mataKuliah->nama,
            'dosen' => $jadwalKuliah->dosen->user->name ?? '-',
            'absensis' => $absensis
        ]);
    }

    public function scanAbsensi(Request $request)
    {
        $request->validate([
            'jadwal' => 'required|integer',
            'pertemuan' => 'required|integer',
            'token' => 'required|string',
        ]);

        $mahasiswa = auth()->user()->mahasiswa;

        $session = AbsensiSession::where('jadwal_kuliah_id', $request->jadwal)
            ->where('pertemuan', $request->pertemuan)
            ->where('token', $request->token)
            ->where('expired_at', '>=', now())
            ->first();

        if (!$session) {
            return back()->withErrors(['msg' => 'QR Code tidak valid atau sudah expired.']);
        }

        $already = Absensi::where('jadwal_kuliah_id', $request->jadwal)
            ->where('mahasiswa_id', $mahasiswa->id)
            ->where('pertemuan', $request->pertemuan)
            ->first();

        if ($already) {
            return back()->with('message', 'Kamu sudah melakukan absensi.');
        }

        Absensi::create([
            'jadwal_kuliah_id' => $request->jadwal,
            'mahasiswa_id' => $mahasiswa->id,
            'pertemuan' => $request->pertemuan,
            'tanggal' => now()->toDateString(),
            'status' => 'hadir',
            'keterangan' => null,
        ]);

        return redirect()->route('mahasiswa.absensi.detail', $request->jadwal)
            ->with('message', 'Absensi berhasil!');
    }

    public function storeQr(Request $request)
    {
        $request->validate([
            'jadwal' => 'required|exists:jadwal_kuliahs,id',
            'pertemuan' => 'required|integer',
            'token' => 'required|string',
        ]);

        $mahasiswa = auth()->user()->mahasiswa;

        $session = AbsensiSession::where('jadwal_kuliah_id', $request->jadwal)
            ->where('pertemuan', $request->pertemuan)
            ->where('token', $request->token)
            ->where('expired_at', '>=', now())
            ->first();

        if (! $session) {
            return back()->withErrors(['msg' => 'QR Code tidak valid atau sudah expired.']);
        }

        Absensi::updateOrCreate(
            [
                'jadwal_kuliah_id' => $request->jadwal,
                'pertemuan' => $request->pertemuan,
                'mahasiswa_id' => $mahasiswa->id,
            ],
            [
                'tanggal' => now()->toDateString(),
                'status' => 'hadir',
                'keterangan' => null,
            ]
        );

        return back()->with('message', 'Absensi berhasil melalui QR Code!');
    }
}
