<?php

namespace App\Observers;

use App\Models\DebtPayment;
use App\Models\CashTransaction;
use App\Models\Account;
use App\Models\Sale;
use App\Models\Branch;
use Illuminate\Support\Facades\Log;

class DebtPaymentObserver
{
    /**
     * Handle the DebtPayment "created" event.
     * Dijalankan otomatis saat Pembayaran Piutang disimpan.
     */
    public function created(DebtPayment $payment): void
    {
        // ------------------------------------------------------------------
        // STEP 0: FILTER KEAMANAN
        // ------------------------------------------------------------------
        // Pastikan ini pembayaran Piutang (Sale), bukan Hutang (Purchase).
        // Karena tabel debt_payments Bapak dipakai campur (mixed).
        if (!empty($payment->purchase_id)) {
            return; // STOP! Jangan diproses kalau ini bayar hutang ke Supplier.
        }

        // ------------------------------------------------------------------
        // STEP 1: TENTUKAN AKUN SUMBER (KREDIT)
        // ------------------------------------------------------------------
        // Sumber dana adalah Piutang Usaha (Aset Berkurang di Kredit)
        // Kode Akun: 1-2001 (Sesuai database Bapak)
        $akunPiutang = Account::where('code', '1-2001')->first(); 

        // ------------------------------------------------------------------
        // STEP 2: TENTUKAN AKUN TUJUAN (DEBIT) - LOGIKA CERDAS
        // ------------------------------------------------------------------
        $akunTujuan = null;

        // PRIORITAS 1: Jika Admin memilih akun manual di form (Web Admin)
        if (!empty($payment->account_id)) {
            $akunTujuan = Account::find($payment->account_id);
        } 
        
        // PRIORITAS 2: Deteksi Otomatis berdasarkan Settingan Cabang (Flutter/Sales)
        else {
            $branch = Branch::find($payment->branch_id);
            
            if ($branch) {
                $metode = strtolower($payment->payment_method ?? 'cash');

                // Jika Transfer / Giro -> Masuk ke Akun Bank Cabang Tersebut
                if (in_array($metode, ['transfer', 'giro', 'bank', 'cek'])) {
                    if ($branch->bank_account_id) {
                        $akunTujuan = Account::find($branch->bank_account_id);
                    }
                } 
                // Jika Tunai -> Masuk ke Akun Kas Cabang Tersebut
                else {
                    if ($branch->cash_account_id) {
                        $akunTujuan = Account::find($branch->cash_account_id);
                    }
                }
            }
        }

        // PRIORITAS 3: Fallback Terakhir (Jika settingan cabang lupa diisi)
        // Default ke Kas Besar Pusat (1-1001) agar jurnal tetap terbentuk
        if (!$akunTujuan) {
            $akunTujuan = Account::where('code', '1-1001')->first();
            Log::warning("Peringatan: Pembayaran ID {$payment->id} masuk ke Default Kas Pusat karena settingan akun cabang belum lengkap.");
        }

        // ------------------------------------------------------------------
        // STEP 3: EKSEKUSI JURNAL (LEDGER)
        // ------------------------------------------------------------------
        if ($akunPiutang && $akunTujuan) {
            
            // Siapkan Nomor Referensi
            $noFaktur = $payment->sale->invoice_number ?? 'MANUAL';
            
            CashTransaction::create([
                'branch_id' => $payment->branch_id,
                'transaction_date' => $payment->payment_date ?? now(),
                
                // Format No Transaksi: PAY-INV001-ID
                'transaction_number' => 'PAY-' . $noFaktur . '-' . $payment->id,
                
                'type' => 'income', // Income = Menambah Saldo Akun Tujuan (Debit)
                'amount' => $payment->amount,
                
                // Kredit: Piutang Usaha (1-2001)
                'source_account_id' => $akunPiutang->id,
                
                // Debit: Kas/Bank sesuai Cabang
                'destination_account_id' => $akunTujuan->id,
                
                'note' => 'Pelunasan Piutang: ' . ($payment->note ?? '-'),
                'user_id' => $payment->user_id ?? auth()->id() ?? 1,
            ]);
        }

        // ------------------------------------------------------------------
        // STEP 4: UPDATE STATUS FAKTUR
        // ------------------------------------------------------------------
        $this->updateSaleStatus($payment);
    }
    
    /**
     * Handle the DebtPayment "deleted" event.
     * Dijalankan otomatis saat Pembayaran dihapus.
     */
    public function deleted(DebtPayment $payment): void
    {
        // 1. Hapus Jurnal Terkait
        CashTransaction::where('transaction_number', 'LIKE', '%PAY-%-' . $payment->id)->delete();
        
        // 2. Kembalikan Status Faktur (Jadi hutang lagi)
        $this->updateSaleStatus($payment);
    }

    /**
     * Fungsi pembantu untuk hitung ulang sisa hutang & update status
     */
    protected function updateSaleStatus($payment)
    {
        if ($payment->sale_id) {
            $sale = Sale::find($payment->sale_id);
            if ($sale) {
                // Hitung total yang SUDAH DIBAYAR untuk faktur ini
                $totalPaid = DebtPayment::where('sale_id', $sale->id)->sum('amount');
                $grandTotal = $sale->grand_total;

                // Tentukan status baru
                $newStatus = 'pending'; // Belum lunas
                
                // Toleransi selisih koma (float) sedikit
                if ($totalPaid >= ($grandTotal - 100)) { 
                    $newStatus = 'paid';
                } elseif ($totalPaid > 0) {
                    $newStatus = 'partial';
                }

                // Update status di tabel sales
                $sale->update([
                    'payment_status' => $newStatus,
                    // Opsional: update paid_amount di tabel sales jika ada kolomnya
                    // 'paid_amount' => $totalPaid 
                ]);
            }
        }
    }
}