<?php

namespace App\Models;

use CodeIgniter\Model;

class PaymentModel extends Model
{
    protected $table = 'payments';
    protected $primaryKey = 'id';
    protected $useTimestamps = true;
    protected $allowedFields = ['invoice_id', 'amount', 'currency', 'payment_method', 'status', 'reference', 'paid_at'];

    /**
     * بعد تسجيل الدفعة: يحدث حالة الفاتورة (لو كل المدفوعات "مكتملة" وصلت للمبلغ الكامل)
     * ويحسب عمولة المسوّق تلقائياً. المدفوعات "قيد التحصيل" (شيكات لم تُحصّل بعد) لا تُحتسب
     * ضمن سداد الفاتورة حتى تتغيّر حالتها لـ "مكتملة".
     */
    public function afterPaymentCreated(int $invoiceId): void
    {
        $invoiceModel = new InvoiceModel();
        $invoice = $invoiceModel->find($invoiceId);
        if (! $invoice) return;

        $totalCompleted = $this->where('invoice_id', $invoiceId)->where('status', 'completed')
            ->selectSum('amount')->first()['amount'] ?? 0;

        if ($totalCompleted >= $invoice['amount'] && $invoice['status'] !== 'paid') {
            $invoiceModel->update($invoiceId, ['status' => 'paid', 'paid_at' => date('Y-m-d H:i:s')]);

            $clientModel = new ClientModel();
            $client = $clientModel->find($invoice['client_id']);

            if ($client && $client['marketer_id']) {
                $marketerModel = new MarketerModel();
                $marketer = $marketerModel->find($client['marketer_id']);
                $commissionAmount = $marketerModel->calculateCommission($marketer, (float) $invoice['amount']);

                $commissionModel = new CommissionModel();
                $commissionModel->insert([
                    'marketer_id' => $marketer['id'],
                    'invoice_id' => $invoice['id'],
                    'amount' => $commissionAmount,
                    'status' => 'pending',
                ]);
            }
        }
    }

    /** إجمالي المدفوعات المكتملة فقط (المستخدم لحساب "المدفوع الفعلي") */
    public function completedTotal(int $invoiceId): float
    {
        return (float) ($this->where('invoice_id', $invoiceId)->where('status', 'completed')
            ->selectSum('amount')->first()['amount'] ?? 0);
    }

    /** إجمالي المدفوعات "قيد التحصيل" (شيكات لم تُصرف بعد) */
    public function pendingTotal(int $invoiceId): float
    {
        return (float) ($this->where('invoice_id', $invoiceId)->where('status', 'pending')
            ->selectSum('amount')->first()['amount'] ?? 0);
    }
}
