<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use App\Models\Penilaian;
use App\Models\PenilaianDetail;
use App\Models\Kelas;
use App\Models\Subject;
use App\Models\Student;
use App\Models\Schedule; // <--- WAJIB TAMBAHKAN INI
use Illuminate\Support\Facades\Auth;

class PenilaianController extends Controller
{
    public function index()
    {
        // ... (Kode index Anda tetap sama) ...
        $user = Auth::user();
        $query = Penilaian::with(['kelas', 'subject']);
        // --- PERBAIKAN HITUNGAN JUMLAH SISWA ---
        // Kita hanya menghitung detail yang kolom 'nilai'-nya TIDAK NULL dan TIDAK KOSONG
        $query->withCount(['details' => function ($q) {
            $q->whereNotNull('nilai')
              ->where('nilai', '!=', '');
        }]);

        if ($user->id == 1 || $user->role === 'super_admin') {
            $subjects = Subject::all(); 
        } elseif ($user->role === 'admin_mapel') {
            $subjectIds = $user->subjects->pluck('id'); 
            $query->whereIn('subject_id', $subjectIds);
            $subjects = $user->subjects; 
        } else {
            $query->where('guru_id', $user->id);
            $subjects = $user->subjects; 
        }

        $penilaians = $query->orderBy('tanggal', 'asc')->get()
                            ->groupBy([
                                function ($item) { return $item->kelas->nama_kelas; },
                                function ($item) { return $item->subject->name; },
                                'jenis_penilaian'
                            ]);
        
        // $kelas = Kelas::all(); // <-- HAPUS ATAU COMMENT INI (Tidak dipakai lagi di dropdown)
        
        // Kita kirim array kosong atau null karena akan diisi via AJAX
        return view('pages.pembelajaran.penilaian.index', compact('penilaians', 'subjects'));
    }

    public function store(Request $request)
    {
        // VALIDASI DIPERLONGGAR (nilai tidak wajib required)
        $request->validate([
        'kelas_id' => 'required',
        'subject_id' => 'required',
        'tanggal' => 'required',
        'jenis_penilaian' => 'required',
        'skala_penilaian' => 'required',
        'topik' => 'required|string|max:255', // <--- TAMBAHKAN INI
        'nilai' => 'nullable|array',
    ]);

        $penilaian = Penilaian::create([
            'guru_id' => Auth::id(),
            'kelas_id' => $request->kelas_id,
            'subject_id' => $request->subject_id,
            'tanggal' => $request->tanggal,
            'jenis_penilaian' => $request->jenis_penilaian,
            'skala_penilaian' => $request->skala_penilaian,
            'topik' => $request->topik,
        ]);

        // SIMPAN NILAI (Hanya yang diisi saja)
        if ($request->has('nilai')) {
            foreach ($request->nilai as $siswa_id => $skor) {
                // Jika skor tidak kosong (null/empty string), baru simpan
                if ($skor !== null && $skor !== '') {
                    PenilaianDetail::create([
                        'penilaian_id' => $penilaian->id,
                        'siswa_id' => $siswa_id,
                        'nilai' => $skor,
                    ]);
                }
            }
        }

        return redirect()->back()->with('success', 'Data penilaian berhasil disimpan!');
    }

        // FUNGSI UPDATE (Menyimpan perubahan)
    public function update(Request $request, $id)
    {
        $penilaian = Penilaian::findOrFail($id);
        $request->validate([
        'topik' => 'required|string|max:255',
    ]);

    $penilaian = Penilaian::findOrFail($id);
    // ... dst kode update
        // PENTING: Skala Penilaian TIDAK KITA UPDATE.
        // Kita hanya update Subject, Tanggal, Jenis, dan Topik.
        $penilaian->update([
            'subject_id' => $request->subject_id,
            'tanggal' => $request->tanggal,
            'jenis_penilaian' => $request->jenis_penilaian,
            'topik' => $request->topik,
        ]);

        // Update Nilai Siswa
        if ($request->has('nilai')) {
            foreach ($request->nilai as $siswa_id => $skor) {
                // Hapus nilai lama siswa ini (reset) lalu input baru, atau update existing
                PenilaianDetail::updateOrCreate(
                    ['penilaian_id' => $id, 'siswa_id' => $siswa_id],
                    ['nilai' => $skor ?? ''] // Jika kosong simpan string kosong/null
                );
            }
        }

        return redirect()->back()->with('success', 'Data penilaian berhasil diperbarui!');
    }


    // API: Ambil Data untuk Edit
    public function getDataForEdit($id)
    {
        $penilaian = Penilaian::with(['kelas', 'subject'])->findOrFail($id);
        
        // Ambil semua siswa di kelas tersebut
        // Left Join dengan tabel penilaian_details untuk mendapatkan nilai yang sudah ada (jika ada)
        $students = Student::where('class', $penilaian->kelas->nama_kelas)
            ->orderBy('name', 'asc')
            ->get()
            ->map(function($student) use ($id) {
                // Cari apakah siswa ini punya nilai di penilaian ini
                $detail = PenilaianDetail::where('penilaian_id', $id)
                            ->where('siswa_id', $student->id)
                            ->first();
                
                $student->existing_nilai = $detail ? $detail->nilai : '';
                return $student;
            });

        return response()->json([
            'penilaian' => $penilaian,
            'students' => $students
        ]);
    }

    // Fungsi Cetak (Sederhana)
    // Fungsi Cetak Rekap (Matrix View)
    public function print(Request $request)
    {
        // 1. Ambil ID dari checkbox
        $ids = explode(',', $request->ids);
        
        // 2. Ambil data penilaian beserta detail dan siswanya
        $assessments = Penilaian::whereIn('id', $ids)
                        ->with(['kelas', 'subject', 'details.student'])
                        ->orderBy('tanggal', 'asc') // Urutkan tanggal agar kolom 1, 2, 3 berurutan
                        ->get();

        // 3. GROUPING DATA
        // Kita kelompokkan berdasarkan: ID Kelas + ID Mapel + Jenis Penilaian
        // Agar yang sejenis masuk ke dalam satu tabel.
        $groupedData = $assessments->groupBy(function($item) {
            return $item->kelas_id . '-' . $item->subject_id . '-' . $item->jenis_penilaian;
        });

        return view('pages.pembelajaran.penilaian.print', compact('groupedData'));
    }

    // Fungsi Get Siswa (Tetap Ada)
    public function getSiswaByKelas($kelas_id)
{
    $kelas = \App\Models\Kelas::find($kelas_id);
    
    // Tambahkan validasi jika kelas tidak ketemu
    if (!$kelas) {
        return response()->json([], 404);
    }

    // OPTIMASI: Hanya ambil kolom 'id' dan 'name'. 
    // Jangan ambil semua kolom (*) agar response lebih kecil dan cepat.
    $students = \App\Models\Student::where('class', $kelas->nama_kelas)
        ->orderBy('name', 'asc')
        ->select('id', 'name') // <--- PENTING
        ->get();

    return response()->json($students);
}
    public function destroy($id)
    {
        // Cari data penilaian berdasarkan ID
        $penilaian = Penilaian::findOrFail($id);
        
        // Hapus data (Otomatis detail nilai siswa ikut terhapus karena setting database cascade)
        $penilaian->delete();

        return redirect()->back()->with('success', 'Data penilaian berhasil dihapus!');
    }
    public function getClasses(Request $request)
    {
        $user = Auth::user();
        $subjectId = $request->subject_id;

        if (!$subjectId) return response()->json([]);

        // 1. Ambil Nama Kelas dari Jadwal Guru
        $scheduledClassNames = Schedule::where('user_id', $user->id)
                                ->where('subject_id', $subjectId)
                                ->pluck('class') // Ambil kolom 'class' (nama string: "X TITL 1")
                                ->unique();

        // 2. Ambil ID dan Nama dari tabel Master Kelas yang namanya cocok
        // Ini penting karena tabel Penilaian butuh 'kelas_id', bukan string nama kelas
        $classes = Kelas::whereIn('nama_kelas', $scheduledClassNames)
                        ->orderBy('nama_kelas')
                        ->get(['id', 'nama_kelas']);

        return response()->json($classes);
    }
}
    
