<?php

namespace App\Controllers;

use App\Controllers\BaseController;
use App\Models\PeminjamanModel;
use App\Models\PengembalianModel;
use App\Models\AnggotaModel;
use App\Models\BukuModel;

class Pengembalian extends BaseController
{
    protected $peminjaman;
    protected $pengembalian;
    protected $db;

    public function __construct()
    {
        $this->peminjaman = new PeminjamanModel();
        $this->pengembalian = new PengembalianModel();
        $this->db = \Config\Database::connect();
    }

    public function index()
    {
        // Ambil data peminjaman yang masih Dipinjam dengan join anggota dan hitung jumlah buku
        $pinjam = $this->db
            ->table('peminjaman')
            ->select('
                MIN(peminjaman.id) as id,
                peminjaman.kode_pinjam,
                peminjaman.anggota_id,
                anggota.nama,
                COUNT(peminjaman.id) as jumlah_buku,
                MAX(peminjaman.tanggal_kembali) as tanggal_kembali,
                MIN(peminjaman.tanggal_pinjam) as tanggal_pinjam
            ')
            ->join('anggota', 'anggota.id = peminjaman.anggota_id')
            ->where('peminjaman.status', 'Dipinjam')
            ->groupBy('peminjaman.kode_pinjam, peminjaman.anggota_id, anggota.nama')
            ->orderBy('MIN(peminjaman.tanggal_pinjam)', 'DESC')
            ->get()
            ->getResultArray();

        // Hitung estimasi denda untuk setiap buku yang masih dipinjam
        foreach ($pinjam as &$p) {
            $jatuhTempo = strtotime($p['tanggal_kembali']);
            $hariIni = strtotime(date('Y-m-d'));
            $terlambat = max(0, floor(($hariIni - $jatuhTempo) / (60 * 60 * 24)));
            $p['estimasi_denda'] = $terlambat * 1000;
            $p['hari_terlambat'] = $terlambat;
        }
        unset($p);

        // Ambil riwayat pengembalian (dari peminjaman yg status Dikembalikan)
        $riwayat = $this->db
            ->table('peminjaman')
            ->select('
                peminjaman.kode_pinjam,
                peminjaman.anggota_id,
                anggota.nama,
                peminjaman.tanggal_kembali,
                peminjaman.denda
            ')
            ->join('anggota', 'anggota.id = peminjaman.anggota_id')
            ->where('peminjaman.status', 'Dikembalikan')
            ->groupBy('peminjaman.kode_pinjam, peminjaman.anggota_id, anggota.nama')
            ->orderBy('peminjaman.tanggal_kembali', 'DESC')
            ->get()
            ->getResultArray();

        // Set field yang dibutuhkan view
        foreach ($riwayat as &$r) {
            $r['tanggal_kembali_real'] = $r['tanggal_kembali'];
            $r['hari_terlambat'] = 0;
            $r['status_bayar'] = ($r['denda'] > 0) ? 'Belum Bayar' : 'Sudah Bayar';
        }
        unset($r);

        $data = [
            'pinjam'  => $pinjam,
            'riwayat' => $riwayat
        ];

        return view('pengembalian/index', $data);
    }

    public function store()
    {
        $kode_pinjam = $this->request->getPost('kode_pinjam');
        $tanggal_kembali_real = $this->request->getPost('tanggal_kembali_real');
        $tarif_denda = (int) $this->request->getPost('tarif_denda');

        // Ambil data peminjaman berdasarkan kode_pinjam
        $pinjam = $this->peminjaman
            ->where('kode_pinjam', $kode_pinjam)
            ->first();

        if (!$pinjam) {
            return redirect()->back()->with('error', 'Data tidak ditemukan');
        }

        // hitung denda
        $jatuhTempo = strtotime($pinjam['tanggal_kembali']);
        $hariIni = strtotime($tanggal_kembali_real);

        $terlambat = max(0, floor(($hariIni - $jatuhTempo) / (60 * 60 * 24)));
        $denda = $terlambat * $tarif_denda;

        // update status semua baris peminjaman dengan kode_pinjam tersebut
        $this->db
            ->table('peminjaman')
            ->where('kode_pinjam', $kode_pinjam)
            ->update([
                'status'          => 'Dikembalikan',
                'tanggal_kembali' => $tanggal_kembali_real,
                'denda'           => $denda
            ]);

        // Kembalikan stok buku
        $bukuPinjam = $this->peminjaman
            ->where('kode_pinjam', $kode_pinjam)
            ->findAll();

        $bukuModel = new BukuModel();
        foreach ($bukuPinjam as $bp) {
            $buku = $bukuModel->find($bp['buku_id']);
            if ($buku) {
                $bukuModel->update($bp['buku_id'], [
                    'stok' => $buku['stok'] + 1
                ]);
            }
        }

        return redirect()->to('/pengembalian')->with('success', 'Buku berhasil dikembalikan');
    }
}
