<?php

namespace App\Http\Controllers;

use App\Models\Peminjaman;
use App\Models\Buku;
use App\Models\AnggotaPerpustakaan;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
use Barryvdh\DomPDF\Facade\Pdf;


class PeminjamanController extends Controller
{
    /**
     * Menampilkan daftar peminjaman
     */
    public function index()
    {
        $peminjaman = Peminjaman::with(['buku', 'anggota.siswa'])
            ->orderBy('created_at', 'desc')
            ->get();

        return view('peminjaman.index', compact('peminjaman'));
    }

    /**
     * Form peminjaman berdasarkan buku yang dipilih
     * WAJIB per ID buku
     */
    public function create($buku_id)
    {
        $buku = Buku::findOrFail($buku_id);

        // hanya anggota aktif
        $anggota = AnggotaPerpustakaan::with('siswa')
            ->where('status', 'aktif')
            ->get();

        return view('peminjaman.create', compact('buku', 'anggota'));
    }

    /**
     * Simpan data peminjaman + kurangi stok buku
     */
    public function store(Request $request)
    {
        $request->validate([
            'buku_id'        => 'required|exists:buku,id',
            'anggota_id'     => 'required|exists:anggota_perpustakaan,id',
            'tanggal_pinjam' => 'required|date',
            'jumlah'         => 'required|integer|min:1',
        ]);

        DB::transaction(function () use ($request) {

            $buku = Buku::lockForUpdate()->findOrFail($request->buku_id);

            // cek stok
            if ($buku->jumlah < $request->jumlah) {
                abort(400, 'Stok buku tidak mencukupi');
            }

            // simpan peminjaman
            Peminjaman::create([
                'buku_id'        => $request->buku_id,
                'anggota_id'     => $request->anggota_id,
                'tanggal_pinjam' => $request->tanggal_pinjam,
                'jumlah'         => $request->jumlah,
                'status'         => 'dipinjam',
            ]);

            // kurangi stok buku
            $buku->update([
                'jumlah' => $buku->jumlah - $request->jumlah
            ]);
        });

        return redirect()
            ->route('peminjaman.index')
            ->with('success', 'Buku berhasil dipinjam');
    }
public function edit($id)
{
    $peminjaman = Peminjaman::with(['buku', 'anggota.siswa'])
        ->findOrFail($id);

    // hanya anggota aktif
    $anggota = AnggotaPerpustakaan::with('siswa')
        ->where('status', 'aktif')
        ->get();

    return view('peminjaman.edit', compact('peminjaman', 'anggota'));
}
public function update(Request $request, $id)
{
    $request->validate([
        'anggota_id'     => 'required|exists:anggota_perpustakaan,id',
        'tanggal_pinjam' => 'required|date',
        'jumlah'         => 'required|integer|min:1',
    ]);

    DB::transaction(function () use ($request, $id) {

        $peminjaman = Peminjaman::lockForUpdate()->findOrFail($id);
        $buku = Buku::lockForUpdate()->findOrFail($peminjaman->buku_id);

        $jumlahLama = $peminjaman->jumlah;
        $jumlahBaru = $request->jumlah;

        // hitung selisih
        $selisih = $jumlahBaru - $jumlahLama;

        // jika jumlah bertambah, cek stok
        if ($selisih > 0 && $buku->jumlah < $selisih) {
            abort(400, 'Stok buku tidak mencukupi');
        }

        // update stok buku
        $buku->update([
            'jumlah' => $buku->jumlah - $selisih
        ]);

        // update peminjaman
        $peminjaman->update([
            'anggota_id'     => $request->anggota_id,
            'tanggal_pinjam' => $request->tanggal_pinjam,
            'jumlah'         => $jumlahBaru,
        ]);
    });

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

    /**
     * Pengembalian buku
     * stok buku dikembalikan
     */
    public function pengembalian($id)
    {
        DB::transaction(function () use ($id) {

            $peminjaman = Peminjaman::with('buku')
                ->lockForUpdate()
                ->findOrFail($id);

            if ($peminjaman->status === 'dikembalikan') {
                abort(400, 'Buku sudah dikembalikan');
            }

            // update stok buku
            $peminjaman->buku->update([
                'jumlah' => $peminjaman->buku->jumlah + $peminjaman->jumlah
            ]);

            // update status peminjaman
            $peminjaman->update([
                'status' => 'dikembalikan',
                'tanggal_kembali' => now()
            ]);
        });

        return redirect()
            ->back()
            ->with('success', 'Buku berhasil dikembalikan');
    }
    /**
 * CETAK INVOICE PEMINJAMAN
 */
public function cetakInvoicePeminjaman($id)
{
    $peminjaman = Peminjaman::with(['buku', 'anggota.siswa'])
        ->findOrFail($id);

    $pdf = Pdf::loadView('peminjaman.invoice_peminjaman', compact('peminjaman'))
        ->setPaper('A4', 'portrait');

    return $pdf->download(
        'Invoice-Peminjaman-'.$peminjaman->anggota->siswa->nama.'.pdf'
    );
}
/**
 * CETAK INVOICE PENGEMBALIAN
 */
public function cetakInvoicePengembalian($id)
{
    $peminjaman = Peminjaman::with(['buku', 'anggota.siswa'])
        ->findOrFail($id);

    if ($peminjaman->status !== 'dikembalikan') {
        return back()->with('error', 'Buku belum dikembalikan');
    }

    $pdf = Pdf::loadView('peminjaman.invoice_pengembalian', compact('peminjaman'))
        ->setPaper('A4', 'portrait');

    return $pdf->download(
        'Invoice-Pengembalian-'.$peminjaman->anggota->siswa->nama.'.pdf'
    );
}

}
