<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Factories\HasFactory;

class BorrowRequest extends Model
{
    use HasFactory;

    protected $fillable = [
        'user_id',
        'item_id',
        'jumlah',
        'tanggal_pinjam',
        'tanggal_kembali',
        'status'
    ];

    // ===================================================================
    // == TAMBAHAN PENTING: CASTING ==
    // ===================================================================
    // Ini wajib ada agar Laravel mengubah string dari database menjadi
    // Objek 'Carbon'. Dengan ini, di View Anda bisa menulis:
    // $request->tanggal_pinjam->format('d M Y, H:i')
    protected $casts = [
        'tanggal_pinjam' => 'datetime',
        'tanggal_kembali' => 'datetime',
    ];

    // ===================================================================
    // == RELASI ==
    // ===================================================================

    public function user()
    {
        return $this->belongsTo(User::class);
    }

    public function item()
    {
        return $this->belongsTo(Item::class);
    }

    public function histories()
    {
        // Urutkan riwayat dari yang paling awal ke yang terbaru
        return $this->hasMany(BorrowRequestHistory::class)->orderBy('created_at', 'asc');
    }

    // ===================================================================
    // == FUNGSI HELPER ==
    // ===================================================================

    /**
     * Cek apakah user yang sedang login dapat melakukan aksi pada request ini.
     * Digunakan di view untuk menampilkan/menyembunyikan tombol aksi.
     */
    public function canBeActedOnBy($user)
    {
        if (!$user) {
            return false;
        }
        
        // Logika approval berjenjang
        switch ($user->role) {
            case 'staff_bidang':
            case 'sekretariat':
                return $this->status === 'pending';
            case 'kepala_bidang':
                return in_array($this->status, ['staff_approved', 'sekretariat_approved'], true);
            default:
                return false;
        }
    }
    
    /**
     * Mendapatkan riwayat terakhir berdasarkan peran.
     */
    public function getHistoryByRole(string $role)
    {
        return $this->histories->where('role', $role)->last();
    }
}
