<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
use Carbon\Carbon;
use Illuminate\Support\Facades\Mail;
use App\Mail\PeminjamanMenungguApproval; 

class BorrowTransaction extends Model
{
    use HasFactory;

    protected $table = 'borrow_transactions';

    protected $fillable = [
        'anggota_id',
        'koleksi_id',
        'tanggal_pinjam',
        'pickup_date',
        'pickup_time',
        'tanggal_kembali',
        'status',
        'surat_pengantar',

        'tanggal_perpanjangan',
        'alasan_perpanjangan',
        'perpanjangan_diajukan',
        'perpanjangan_disetujui',
    ];

    public $timestamps = true;

   
    public function anggota()
    {
        return $this->belongsTo(\App\Models\Anggota::class, 'anggota_id');
    }

    public function koleksi()
    {
        return $this->belongsTo(\App\Models\Koleksi::class, 'koleksi_id', 'biblio_id');
    }

   
    public function scopeMenunggu($query)
    {
        return $query->where('status', 'menunggu');
    }

    public function scopeDisetujui($query)
    {
        return $query->where('status', 'disetujui');
    }

    public function scopeDipinjam($query)
    {
        return $query->where('status', 'dipinjam');
    }

    public function scopeDikembalikan($query)
    {
        return $query->where('status', 'dikembalikan');
    }

    public function scopeDitolak($query)
    {
        return $query->where('status', 'ditolak');
    }

    public function scopePengembalianMenunggu($query)
    {
        return $query->where('status', 'pengembalian_menunggu');
    }

    public function scopePerpanjanganMenunggu($query)
    {
        return $query->where('status', 'perpanjangan_menunggu');
    }

   
    public static function sudahDipinjam($koleksiId)
    {
        return self::where('koleksi_id', $koleksiId)
            ->whereIn('status', ['dipinjam', 'menunggu', 'disetujui'])
            ->exists();
    }

    public function markAsDisetujui($pickupDate = null)
    {
        $this->status = 'disetujui';
        $this->pickup_date = $pickupDate ? Carbon::parse($pickupDate) : Carbon::today();
        $this->save();
    }

    public function markAsDipinjam()
    {
        $this->status = 'dipinjam';
        $this->tanggal_pinjam = Carbon::today();
        $this->save();
    }

    public function markAsDitolak()
    {
        $this->status = 'ditolak';
        $this->save();
    }

    public function markAsDikembalikan()
{
    // Menggunakan update langsung ke database berdasarkan ID target
    $this->where('id', $this->id)->update([
        'status' => 'dikembalikan',
        'tanggal_kembali' => \Carbon\Carbon::today()
    ]);

    // Sinkronisasi data object yang sedang aktif di memory
    $this->status = 'dikembalikan';
    $this->tanggal_kembali = \Carbon\Carbon::today();
}

    public function markAsPengembalianMenunggu()
    {
        $this->status = 'pengembalian_menunggu';
        $this->tanggal_kembali = null;
        $this->save();
    }

   
    public function ajukanPerpanjangan($tanggalBaru, $alasan)
    {
        if ($this->perpanjangan_diajukan) {
            throw new \Exception('Anda sudah pernah mengajukan perpanjangan untuk buku ini.');
        }

        $this->tanggal_perpanjangan = Carbon::parse($tanggalBaru);
        $this->alasan_perpanjangan = $alasan;
        $this->status = 'perpanjangan_menunggu';
        $this->perpanjangan_diajukan = true;
        $this->perpanjangan_disetujui = null;
        $this->save();
    }

  
    public function setujuiPerpanjangan()
    {
        $this->tanggal_kembali = $this->tanggal_perpanjangan;
        $this->status = 'dipinjam';
        $this->perpanjangan_disetujui = true;
        $this->save();
    }

   
    public function tolakPerpanjangan()
    {
        $this->status = 'dipinjam';
        $this->perpanjangan_disetujui = false;
        $this->save();
    }

   
    public function getIsBorrowedAttribute()
    {
        return $this->status === 'dipinjam';
    }

    public function getIsApprovedAttribute()
    {
        return $this->status === 'disetujui';
    }

    public function getIsReturnPendingAttribute()
    {
        return $this->status === 'pengembalian_menunggu';
    }

    public function getIsExtensionPendingAttribute()
    {
        return $this->status === 'perpanjangan_menunggu';
    }

    public function getIsExtensionApprovedAttribute()
    {
        return $this->perpanjangan_disetujui === true;
    }

    public function getIsExtensionRejectedAttribute()
    {
        return $this->perpanjangan_disetujui === false;
    }

    
    public function canBeExtended()
    {
        return $this->status === 'dipinjam' && !$this->perpanjangan_diajukan;
    }

    public function canBeReturnedByUser()
    {
        return $this->status === 'dipinjam';
    }

    public function canBeRated()
    {
        return $this->status === 'dikembalikan';
    }

    
    public function isLate()
    {
        if (!$this->tanggal_kembali) return false;
        return Carbon::now()->greaterThan(Carbon::parse($this->tanggal_kembali));
    }

  
    public function getLateDays()
    {
        if (!$this->isLate()) return 0;
        return Carbon::parse($this->tanggal_kembali)->diffInDays(Carbon::now());
    }

    
    public static function boot()
    {
        parent::boot();

        static::created(function ($transaction) {
            if (env('MAIL_USERNAME')) {
                try {
                    Mail::to(config('mail.from.address'))
                        ->send(new PeminjamanMenungguApproval($transaction));
                } catch (\Exception $e) {
                    \Log::error('Gagal mengirim email peminjaman ke admin: ' . $e->getMessage());
                }
            }
        });
    }
}

