<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use App\Models\TahunAjaran;
use Barryvdh\DomPDF\Facade\Pdf;

class TahunAjaranController extends Controller
{
    public function tahunajaran()
    {
        $tahunAjarans = TahunAjaran::orderBy('tanggal_mulai', 'desc')->get();
        return view('admin.tahunajaran', compact('tahunAjarans'));
    }

    public function tambahtahunajaran(Request $request)
    {
        $request->validate([
            'nama' => 'required|string|max:255',
            'tanggal_mulai' => 'required|date',
            'tanggal_selesai' => 'required|date|after:tanggal_mulai',
        ]);

        $nama = $request->input('nama');
        $tanggalMulai = $request->input('tanggal_mulai');
        $tanggalSelesai = $request->input('tanggal_selesai');

        // Cek apakah nama tahun ajaran sudah ada
        $duplikatNama = TahunAjaran::where('nama', $nama)->exists();
        if ($duplikatNama) {
            toastr()->error('Tahun ajaran dengan nama tersebut sudah ada.');
            return redirect()->back();
        }

        // Cek overlap tanggal dengan tahun ajaran lain
        $overlap = TahunAjaran::where(function($query) use ($tanggalMulai, $tanggalSelesai) {
            $query->whereBetween('tanggal_mulai', [$tanggalMulai, $tanggalSelesai])
                  ->orWhereBetween('tanggal_selesai', [$tanggalMulai, $tanggalSelesai])
                  ->orWhere(function($q) use ($tanggalMulai, $tanggalSelesai) {
                      $q->where('tanggal_mulai', '<=', $tanggalMulai)
                        ->where('tanggal_selesai', '>=', $tanggalSelesai);
                  });
        })->exists();

        if ($overlap) {
            toastr()->error('Periode tahun ajaran bertumpang tindih dengan tahun ajaran yang sudah ada.');
            return redirect()->back();
        }

        $tahunAjaran = new TahunAjaran();
        $tahunAjaran->nama = $nama;
        $tahunAjaran->tanggal_mulai = $tanggalMulai;
        $tahunAjaran->tanggal_selesai = $tanggalSelesai;
        $tahunAjaran->is_active = $request->has('is_active') ? true : false;

        // Jika set sebagai aktif, nonaktifkan yang lain
        if ($tahunAjaran->is_active) {
            TahunAjaran::where('is_active', true)->update(['is_active' => false]);
        }

        if ($tahunAjaran->save()) {
            toastr()->success('Data tahun ajaran berhasil ditambahkan.');
        } else {
            toastr()->error('Gagal menambahkan data tahun ajaran.');
        }

        return redirect()->route('tahunajaran');
    }

    public function updatetahunajaran(Request $request, $id)
    {
        $request->validate([
            'nama' => 'required|string|max:255',
            'tanggal_mulai' => 'required|date',
            'tanggal_selesai' => 'required|date|after:tanggal_mulai',
        ]);

        $tahunAjaran = TahunAjaran::findOrFail($id);
        
        $nama = $request->input('nama');
        $tanggalMulai = $request->input('tanggal_mulai');
        $tanggalSelesai = $request->input('tanggal_selesai');

        // Cek duplikasi nama (kecuali yang sedang diedit)
        $duplikatNama = TahunAjaran::where('nama', $nama)
                                   ->where('id', '!=', $id)
                                   ->exists();
        if ($duplikatNama) {
            toastr()->error('Tahun ajaran dengan nama tersebut sudah ada.');
            return redirect()->back();
        }

        // Cek overlap tanggal (kecuali yang sedang diedit)
        $overlap = TahunAjaran::where('id', '!=', $id)
                              ->where(function($query) use ($tanggalMulai, $tanggalSelesai) {
                                  $query->whereBetween('tanggal_mulai', [$tanggalMulai, $tanggalSelesai])
                                        ->orWhereBetween('tanggal_selesai', [$tanggalMulai, $tanggalSelesai])
                                        ->orWhere(function($q) use ($tanggalMulai, $tanggalSelesai) {
                                            $q->where('tanggal_mulai', '<=', $tanggalMulai)
                                              ->where('tanggal_selesai', '>=', $tanggalSelesai);
                                        });
                              })->exists();

        if ($overlap) {
            toastr()->error('Periode tahun ajaran bertumpang tindih dengan tahun ajaran yang sudah ada.');
            return redirect()->back();
        }

        // Jika diset sebagai aktif, nonaktifkan yang lain
        $isActive = $request->has('is_active') ? true : false;
        if ($isActive) {
            TahunAjaran::where('is_active', true)->where('id', '!=', $id)->update(['is_active' => false]);
        }

        $tahunAjaran->nama = $nama;
        $tahunAjaran->tanggal_mulai = $tanggalMulai;
        $tahunAjaran->tanggal_selesai = $tanggalSelesai;
        $tahunAjaran->is_active = $isActive;

        if ($tahunAjaran->save()) {
            toastr()->success('Data tahun ajaran berhasil diupdate.');
        } else {
            toastr()->error('Gagal memperbarui data tahun ajaran.');
        }

        return redirect()->route('tahunajaran')->with('reload', true);
    }

    public function hapustahunajaran($id)
    {
        $tahunAjaran = TahunAjaran::findOrFail($id);
        
        // Cek apakah tahun ajaran ini sedang digunakan oleh siswa
        if ($tahunAjaran->siswas()->count() > 0) {
            toastr()->error('Tahun ajaran tidak dapat dihapus karena masih digunakan oleh data siswa.');
            return redirect()->back();
        }

        $tahunAjaran->delete();

        toastr()->success('Data tahun ajaran berhasil dihapus.');
        return redirect()->route('tahunajaran');
    }

    public function downloadtahunajaran()
    {
        $tahunAjarans = TahunAjaran::orderBy('tanggal_mulai', 'desc')->get();
        $pdf = Pdf::loadView('admin.tahunajaranpdf', compact('tahunAjarans'));
        return $pdf->download('data_tahun_ajaran.pdf');
    }

    public function setaktif($id)
    {
        // Nonaktifkan semua tahun ajaran
        TahunAjaran::where('is_active', true)->update(['is_active' => false]);
        
        // Aktifkan tahun ajaran yang dipilih
        $tahunAjaran = TahunAjaran::findOrFail($id);
        $tahunAjaran->is_active = true;
        $tahunAjaran->save();

        toastr()->success('Tahun ajaran berhasil diaktifkan.');
        return redirect()->route('tahunajaran');
    }
}
