<?php

namespace App\Http\Controllers;

use App\Models\Pelanggaran;
use App\Models\Santri;
use App\Models\Kelas;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;

class PelanggaranController extends Controller
{

    public function index(Request $request)
    {
        $user = Auth::user();

        $query = Pelanggaran::with(['santri', 'kelas', 'user'])
            ->orderBy('created_at', 'desc');

        // filter berdasarkan role guru
        if ($user->role === 'guru') {
            $query->where('user_id', $user->id);
        }

        // filter search nama santri
        if ($request->has('search') && $request->search != '') {
            $query->whereHas('santri', function ($q) use ($request) {
                $q->where('nama', 'like', '%' . $request->search . '%');
            });
        }

        $pelanggarans = $query->paginate(10);

        $view = $user->role === 'guru' ? 'guru.pelanggarans.index' : 'pelanggarans.index';
        return view($view, compact('pelanggarans'));
    }


    public function create()
    {
        $santris = Santri::all();
        $kelas = Kelas::all();

        $view = auth()->user()->isGuru() ? 'guru.pelanggarans.create' : 'pelanggarans.create';
        return view($view, compact('santris', 'kelas'));
    }

    public function store(Request $request)
    {
        $validated = $request->validate([
            'santri_id' => 'required|exists:santris,id',
            'kelas_id' => 'required|exists:kelas,id',
            'jenis_pelanggaran' => 'required|string|max:255',
            'hukuman' => 'required|in:Teguran Lisan,Teguran Tertulis,Skorsing,Lainnya',
            'keterangan_hukuman' => 'nullable|string|max:255',
            'hukuman_selesai' => 'nullable',
        ]);

        $validated['user_id'] = Auth::id();
        $validated['hukuman_selesai'] = $request->has('hukuman_selesai') ? 'selesai' : 'belum';

        Pelanggaran::create($validated);

        return redirect()->route('pelanggarans.index')->with('success', 'Data pelanggaran berhasil ditambahkan.');
    }

    public function update(Request $request, Pelanggaran $pelanggaran)
    {
        $validated = $request->validate([
            'santri_id' => 'required|exists:santris,id',
            'kelas_id' => 'required|exists:kelas,id',
            'jenis_pelanggaran' => 'required|string|max:255',
            'hukuman' => 'required|in:Teguran Lisan,Teguran Tertulis,Skorsing,Lainnya',
            'keterangan_hukuman' => 'nullable|string|max:255',
            'hukuman_selesai' => 'nullable',
        ]);

        $validated['hukuman_selesai'] = $request->has('hukuman_selesai') ? 'selesai' : 'belum';

        $pelanggaran->update($validated);

        return redirect()->route('pelanggarans.index')->with('success', 'Data pelanggaran berhasil diperbarui.');
    }


    public function show(Pelanggaran $pelanggaran)
    {
        $this->authorizeAccess($pelanggaran);

        $view = auth()->user()->isGuru() ? 'guru.pelanggarans.show' : 'pelanggarans.show';
        return view($view, compact('pelanggaran'));
    }

    public function edit(Pelanggaran $pelanggaran)
    {
        $this->authorizeAccess($pelanggaran);

        $santris = Santri::all();
        $kelas = Kelas::all();

        $view = auth()->user()->isGuru() ? 'guru.pelanggarans.edit' : 'pelanggarans.edit';
        return view($view, compact('pelanggaran', 'santris', 'kelas'));
    }

    public function destroy(Pelanggaran $pelanggaran)
    {
        $this->authorizeAccess($pelanggaran);

        $pelanggaran->delete();

        return redirect()->route('pelanggarans.index')->with('success', 'Data pelanggaran berhasil dihapus.');
    }

    protected function authorizeAccess(Pelanggaran $pelanggaran)
    {
        $user = Auth::user();

        if ($user->role === 'guru' && $pelanggaran->user_id !== $user->id) {
            abort(403, 'Unauthorized');
        }
    }
}
