<?php

namespace App\Http\Controllers;

use App\Models\Guru;
use App\Models\Pelanggaran;
use App\Models\Siswa;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\DB;

class PelanggaranController extends Controller
{

    public function index()
    {
        $userId = Auth::id();

        if (Auth::check()) {
            $userRole = Auth::user()->roles->first()->name;

            if ($userRole === 'Siswa') {
                $siswa = Siswa::where('id_user', $userId)->first();

                if ($siswa) {
                    $pelanggaran = Pelanggaran::with('siswa', 'guru', 'point')
                        ->where('id_siswa', $siswa->id_siswa)
                        ->orderBy('tanggal', 'desc')
                        ->get();

                    return view('pelanggaran.index', ['pelanggarans' => $pelanggaran]);
                }
            } else {
                $lastPelanggaranIds = Pelanggaran::selectRaw('MAX(id_pelanggaran) as id_pelanggaran')
                    ->groupBy('id_siswa')
                    ->pluck('id_pelanggaran');

                $pelanggarans = Pelanggaran::with('siswa', 'guru', 'point')
                    ->whereIn('id_pelanggaran', $lastPelanggaranIds)
                    ->get();

                return view('pelanggaran.index', ['pelanggarans' => $pelanggarans]);
            }
        }
    }

    public function create()
    {
        //
    }


    public function store(Request $request)
    {
        $validate = $request->validate([
            'id_siswa' => 'required|exists:siswas,id_siswa',
            'id_guru' => 'required|exists:gurus,id_guru',
            'tanggal' => 'required|date',
            'id_point_pelanggaran' => 'required|exists:point_pelanggarans,id_point_pelanggaran',
        ]);

        $point = \App\Models\PointPelanggaran::where('id_point_pelanggaran', $validate['id_point_pelanggaran'])->first()->point;

        $saldoSebelumnya = \App\Models\Pelanggaran::where('id_siswa', $validate['id_siswa'])
            ->latest()
            ->first()
            ->saldo_pelanggaran ?? 0;

        $hasil = $saldoSebelumnya + $point;
        $keterangan = '-';

        // Simpan pelanggaran baru
        Pelanggaran::create([
            'tanggal' => $validate['tanggal'],
            'id_point_pelanggaran' => $validate['id_point_pelanggaran'],
            'jmlh_pelanggaran' => $point,
            'saldo_pelanggaran' => $hasil,
            'keterangan' => $keterangan,
            'id_siswa' => $validate['id_siswa'],
            'id_guru' => $validate['id_guru'],
        ]);

        $notification = [
            'message' => 'Data pelanggaran siswa berhasil ditambahkan',
            'alert-type' => 'success'
        ];

        return redirect()->route('pelanggaran.index')->with($notification);
    }

    public function edit(string $id_pelanggaran)
    {
        //
    }

    public function update(Request $request, string $id_pelanggaran)
    {
        $pelanggaran = Pelanggaran::findOrFail($id_pelanggaran);

        $validate = $request->validate([
            'id_siswa' => 'required|exists:siswas,id_siswa',
            'id_guru' => 'required|exists:gurus,id_guru',
            'tanggal' => 'required|date',
            'id_point_pelanggaran' => 'required|exists:point_pelanggarans,id_point_pelanggaran',
        ]);

        $point = \App\Models\PointPelanggaran::where('id_point_pelanggaran', $validate['id_point_pelanggaran'])->first()->point;

        $saldoSebelumnya = \App\Models\Pelanggaran::where('id_siswa', $validate['id_siswa'])
            ->latest()
            ->first()
            ->saldo_pelanggaran ?? 0;
        $hasil = $saldoSebelumnya + $point;

        $pelanggaran->update([
            'id_siswa' => $validate['id_siswa'],
            'id_guru' => $validate['id_guru'],
            'tanggal' => $validate['tanggal'],
            'id_point_pelanggaran' => $validate['id_point_pelanggaran'],
            'saldo_pelanggaran' => $hasil,
        ]);

        $notificaton = array(
            'message' => 'Data pelanggaran siswa berhasil diperbaharui',
            'alert-type' => 'success'
        );

        return redirect()->route('pelanggaran.index')->with($notificaton);
    }
    public function destroy(string $id_pelanggaran)
    {
        $pelanggaran = Pelanggaran::findOrFail($id_pelanggaran);

        $pelanggaran->delete();

        $notificaton = array(
            'message' => 'Data pelanggaran siswa berhasil dihapus',
            'alert-type' => 'success'
        );

        return redirect()->route('pelanggaran.index')->with($notificaton);
    }

    public function show($id_pelanggaran)
    {
        $pelanggaran = Pelanggaran::with('siswa')->findOrFail($id_pelanggaran);
        $siswa = $pelanggaran->siswa;

        return view('pelanggaran.detail', compact('pelanggaran', 'siswa'));
    }
}
