<?php

namespace App\Http\Controllers\Admin;

use Inertia\Inertia;
use App\Models\Dosen;
use App\Models\MataKuliah;
use App\Models\JadwalKuliah;
use App\Models\TahunAkademik;
use Illuminate\Http\Request;
use App\Http\Controllers\Controller;

class JadwalKuliahController extends Controller
{
    public function index(Request $request)
    {
        $filters = $request->only(['search', 'hari']);
        $tahunAktif = TahunAkademik::where('is_aktif', true)->first();

        $query = JadwalKuliah::query()
            ->with(['mataKuliah', 'dosen.user', 'tahunAkademik'])
            ->when($tahunAktif, fn($q) => $q->where('tahun_akademik_id', $tahunAktif->id));

        if ($request->filled('search')) {
            $query->whereHas('mataKuliah', function ($q) use ($request) {
                $q->where('kode', 'like', '%' . $request->search . '%')
                  ->orWhere('nama', 'like', '%' . $request->search . '%');
            });
        }

        if ($request->filled('hari')) {
            $query->where('hari', $request->hari);
        }

        $jadwals = $query->latest()->paginate(10)->withQueryString();

        return Inertia::render('Admin/JadwalKuliah/Index', [
            'jadwals' => $jadwals,
            'filters' => $filters,
            'tahunAktif' => $tahunAktif,
        ]);
    }

    public function create()
    {
        $tahunAktif = TahunAkademik::where('is_aktif', true)->first();

        return inertia('Admin/JadwalKuliah/Create', [
            // Ambil semua mata kuliah (tidak dikunci prodi)
            'mataKuliahs' => MataKuliah::with('prodi')->get(),
            // Ambil semua dosen (tidak dikunci prodi)
            'dosens' => Dosen::with('user')->get(),
            'tahunAktif' => $tahunAktif,
        ]);
    }

    public function store(Request $request)
    {
        $tahunAktif = TahunAkademik::where('is_aktif', true)->first();
        if (!$tahunAktif) {
            return back()->withErrors([
                'tahun_akademik_id' => 'Tidak ada tahun akademik yang aktif. Silakan set tahun akademik terlebih dahulu.'
            ]);
        }

        $validated = $request->validate([
            'mata_kuliah_id' => ['required', 'exists:mata_kuliahs,id'],
            'dosen_id' => ['required', 'exists:dosens,id'],
            'kelas' => ['nullable','string','max:5'],
            'hari' => ['required','string'],
            'jam_mulai' => ['required','date_format:H:i'],
            'jam_selesai' => ['required','date_format:H:i','after:jam_mulai'],
            'ruangan' => ['nullable','string','max:50'],
        ]);

        $validated['tahun_akademik_id'] = $tahunAktif->id;

        // cek bentrok ruangan
        $bentrokRuangan = JadwalKuliah::where('hari', $validated['hari'])
            ->where('ruangan', $validated['ruangan'])
            ->where('tahun_akademik_id', $tahunAktif->id)
            ->where(function ($q) use ($validated) {
                $q->where('jam_mulai', '<', $validated['jam_selesai'])
                  ->where('jam_selesai', '>', $validated['jam_mulai']);
            })
            ->exists();

        if ($bentrokRuangan) {
            return back()->withErrors([
                'ruangan' => 'Jadwal bentrok: ruangan sudah terpakai pada jam tersebut.'
            ])->withInput();
        }

        // cek bentrok dosen
        $bentrokDosen = JadwalKuliah::where('hari', $validated['hari'])
            ->where('dosen_id', $validated['dosen_id'])
            ->where('tahun_akademik_id', $tahunAktif->id)
            ->where(function ($q) use ($validated) {
                $q->where('jam_mulai', '<', $validated['jam_selesai'])
                  ->where('jam_selesai', '>', $validated['jam_mulai']);
            })
            ->exists();

        if ($bentrokDosen) {
            return back()->withErrors([
                'dosen_id' => 'Jadwal bentrok: dosen sudah mengajar kelas lain pada jam tersebut.'
            ])->withInput();
        }

        JadwalKuliah::create($validated);

        return redirect()->route('jadwal-kuliah.index')
            ->with('success', 'Jadwal kuliah berhasil ditambahkan.');
    }

    public function edit(JadwalKuliah $jadwalKuliah)
    {
        $tahunAktif = TahunAkademik::where('is_aktif', true)->first();

        return inertia('Admin/JadwalKuliah/Edit', [
            'jadwalKuliah' => $jadwalKuliah->load(['mataKuliah','dosen.user','tahunAkademik']),
            'mataKuliahs' => MataKuliah::with('prodi')->get(),
            'dosens' => Dosen::with('user')->get(),
            'tahunAktif' => $tahunAktif,
        ]);
    }

    public function update(Request $request, JadwalKuliah $jadwalKuliah)
    {
        $tahunAktif = TahunAkademik::where('is_aktif', true)->first();
        if (!$tahunAktif) {
            return back()->withErrors([
                'tahun_akademik_id' => 'Tidak ada tahun akademik yang aktif. Silakan set tahun akademik terlebih dahulu.'
            ]);
        }

        $validated = $request->validate([
            'mata_kuliah_id' => ['required', 'exists:mata_kuliahs,id'],
            'dosen_id' => ['required', 'exists:dosens,id'],
            'kelas' => ['nullable','string','max:5'],
            'hari' => ['required','string'],
            'jam_mulai' => ['required','date_format:H:i'],
            'jam_selesai' => ['required','date_format:H:i','after:jam_mulai'],
            'ruangan' => ['nullable','string','max:50'],
        ]);

        $validated['tahun_akademik_id'] = $tahunAktif->id;

        // cek bentrok ruangan
        $bentrokRuangan = JadwalKuliah::where('hari', $validated['hari'])
            ->where('ruangan', $validated['ruangan'])
            ->where('tahun_akademik_id', $tahunAktif->id)
            ->where('id', '!=', $jadwalKuliah->id)
            ->where(function ($q) use ($validated) {
                $q->where('jam_mulai', '<', $validated['jam_selesai'])
                  ->where('jam_selesai', '>', $validated['jam_mulai']);
            })
            ->exists();

        if ($bentrokRuangan) {
            return back()->withErrors([
                'ruangan' => 'Jadwal bentrok: ruangan sudah terpakai pada jam tersebut.'
            ])->withInput();
        }

        // cek bentrok dosen
        $bentrokDosen = JadwalKuliah::where('hari', $validated['hari'])
            ->where('dosen_id', $validated['dosen_id'])
            ->where('tahun_akademik_id', $tahunAktif->id)
            ->where('id', '!=', $jadwalKuliah->id)
            ->where(function ($q) use ($validated) {
                $q->where('jam_mulai', '<', $validated['jam_selesai'])
                  ->where('jam_selesai', '>', $validated['jam_mulai']);
            })
            ->exists();

        if ($bentrokDosen) {
            return back()->withErrors([
                'dosen_id' => 'Jadwal bentrok: dosen sudah mengajar kelas lain pada jam tersebut.'
            ])->withInput();
        }

        $jadwalKuliah->update($validated);

        return redirect()->route('jadwal-kuliah.index')
            ->with('success', 'Jadwal kuliah berhasil diperbarui.');
    }

    public function destroy(JadwalKuliah $jadwalKuliah)
    {
        $jadwalKuliah->delete();

        return redirect()->route('jadwal-kuliah.index')
            ->with('success', 'Jadwal kuliah berhasil dihapus.');
    }
}
