<?php

namespace App\Http\Controllers;

use App\Models\Krs;
use App\Models\JadwalKuliah;
use Illuminate\Http\Request;
use App\Models\ELearningPost;
use App\Models\TahunAkademik;

class ELearningPostController extends Controller
{
    public function index($jadwalKuliahId)
    {
        $jadwal = JadwalKuliah::with('mataKuliah')->findOrFail($jadwalKuliahId);

        $posts = ELearningPost::with(['user', 'comments.user'])
            ->where('jadwal_kuliah_id', $jadwalKuliahId)
            ->latest()
            ->get();

        return inertia('Dosen/ELearning/Index', [
            'jadwalKuliahId' => $jadwalKuliahId,
            'mataKuliah' => $jadwal->mataKuliah,
            'posts' => $posts,
        ]);
    }

    public function create($jadwalKuliahId)
    {
        $jadwal = JadwalKuliah::with('mataKuliah')->findOrFail($jadwalKuliahId);

        return inertia('Dosen/ELearning/Create', [
            'jadwalKuliahId' => $jadwalKuliahId,
            'mataKuliah' => $jadwal->mataKuliah,
        ]);
    }

    public function store(Request $request, $jadwalKuliahId)
    {
        $request->validate([
            'judul' => 'required|string|max:255',
            'pertemuan' => 'required|integer',
            'deskripsi' => 'nullable|string',
            'link_eksternal' => 'nullable|string',
            'link_youtube' => 'nullable|url',
        ], [
            'judul.required' => 'Judul wajib diisi.',
            'judul.max' => 'Judul maksimal 255 karakter.',
            'pertemuan.required' => 'Pertemuan wajib diisi.',
            'pertemuan.integer' => 'Pertemuan harus berupa angka.',
            'deskripsi.string' => 'Deskripsi harus berupa teks.',
            'link_youtube.url' => 'Link YouTube harus berupa URL yang valid.',
        ]);

        ELearningPost::create([
            'jadwal_kuliah_id' => $jadwalKuliahId,
            'user_id' => auth()->id(),
            'judul' => $request->judul,
            'pertemuan' => $request->pertemuan,
            'deskripsi' => $request->deskripsi,
            'link_eksternal' => $request->link_eksternal,
            'link_youtube' => $request->link_youtube,
        ]);

        return redirect()->route('dosen.elearning.index', $jadwalKuliahId)->with('success', 'Postingan berhasil dibuat.');
    }

    public function edit($postId)
    {
        $post = ELearningPost::with('jadwalKuliah.mataKuliah')->findOrFail($postId);

        if ($post->user_id !== auth()->id()) {
            abort(403, 'Anda tidak memiliki izin untuk mengubah postingan ini.');
        }

        return inertia('Dosen/ELearning/Edit', [
            'post' => $post,
            'mataKuliah' => $post->jadwalKuliah->mataKuliah,
        ]);
    }


    public function update(Request $request, $postId)
    {
        $post = ELearningPost::findOrFail($postId);

        if ($post->user_id !== auth()->id()) {
            abort(403, 'Anda tidak memiliki izin untuk mengubah postingan ini.');
        }

        $request->validate([
            'judul' => 'required|string|max:255',
            'pertemuan' => 'required|integer',
            'deskripsi' => 'nullable|string',
            'link_eksternal' => 'nullable|string',
            'link_youtube' => 'nullable|url',
        ], [
            'judul.required' => 'Judul wajib diisi.',
            'judul.max' => 'Judul maksimal 255 karakter.',
            'pertemuan.required' => 'Pertemuan wajib diisi.',
            'pertemuan.integer' => 'Pertemuan harus berupa angka.',
        ]);

        $post->update($request->only([
            'judul',
            'pertemuan',
            'deskripsi',
            'link_eksternal',
            'link_youtube',
        ]));

        return redirect()->route('dosen.elearning.index', $post->jadwalKuliah->id)
            ->with('success', 'Postingan berhasil diperbarui.');
    }

    public function destroy($postId)
    {
        $post = ELearningPost::findOrFail($postId);

        if ($post->user_id !== auth()->id()) {
            abort(403, 'Anda tidak memiliki izin untuk menghapus postingan ini.');
        }

        $post->delete();

        return back()->with('success', 'Postingan berhasil dihapus.');
    }

    public function show($postId)
    {
        $post = ELearningPost::with(['user', 'comments.user', 'jadwalKuliah.mataKuliah'])->findOrFail($postId);

        return inertia('ELearning/Show', [
            'post' => $post,
            'mataKuliah' => $post->jadwalKuliah->mataKuliah,
        ]);
    }

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

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

        if (! $tahunAkademikAktif) {
            return redirect()->route('dashboard')
                ->withErrors(['tahun_akademik' => 'Tahun akademik aktif belum ditentukan.']);
        }

        $mataKuliahs = Krs::with('details.jadwalKuliah.mataKuliah')
            ->where('mahasiswa_id', $mahasiswa->id)
            ->where('tahun_akademik_id', $tahunAkademikAktif->id)
            ->get()
            ->flatMap(function ($krs) {
                return $krs->details->map(fn($detail) => [
                    'jadwal_kuliah_id' => $detail->jadwalKuliah->id,
                    'mata_kuliah_id' => $detail->jadwalKuliah->mataKuliah->id,
                    'nama' => $detail->jadwalKuliah->mataKuliah->nama,
                    'kode' => $detail->jadwalKuliah->mataKuliah->kode,
                    'sks'  => $detail->jadwalKuliah->mataKuliah->sks,
                ]);
            })
            ->unique('mata_kuliah_id')
            ->values();

        return inertia('Mahasiswa/ELearning/Dashboard', [
            'mahasiswa' => $mahasiswa->load('user'),
            'mataKuliahs' => $mataKuliahs,
            'tahunAkademik' => $tahunAkademikAktif,
        ]);
    }

    public function indexMahasiswa($jadwalKuliahId)
    {
        $jadwal = JadwalKuliah::with('mataKuliah')->findOrFail($jadwalKuliahId);

        $posts = ELearningPost::with(['user', 'comments.user'])
            ->where('jadwal_kuliah_id', $jadwalKuliahId)
            ->latest()
            ->get();

        return inertia('Mahasiswa/ELearning/Index', [
            'jadwalKuliah' => $jadwal,
            'mataKuliah'   => $jadwal->mataKuliah,
            'posts'        => $posts,
        ]);
    }
    

    public function showMahasiswa($postId)
    {
        $post = ELearningPost::with(['user', 'comments.user', 'jadwalKuliah.mataKuliah'])->findOrFail($postId);

        return inertia('Mahasiswa/ELearning/Show', [
            'post' => $post,
            'mataKuliah' => $post->jadwalKuliah->mataKuliah,
        ]);
    }
}
