<?php

namespace App\Models\Tenant;

use App\Models\Concerns\BelongsToTenant;
use App\Models\Concerns\Auditable;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\BelongsTo;
use Illuminate\Database\Eloquent\SoftDeletes;

class Payment extends Model
{
    use Auditable, BelongsToTenant, SoftDeletes;

    public const METHODS = [
        'cash' => 'Numerar',
        'card' => 'Card',
        'transfer' => 'Virament',
        'mobile' => 'Mobile pay',
    ];

    protected $fillable = [
        'company_id', 'client_id', 'work_order_id', 'user_id',
        'paid_at', 'amount', 'method', 'reference', 'notes',
    ];

    protected $casts = [
        'paid_at' => 'date',
        'amount' => 'decimal:2',
    ];

    public function client(): BelongsTo
    {
        return $this->belongsTo(Client::class);
    }

    public function workOrder(): BelongsTo
    {
        return $this->belongsTo(WorkOrder::class);
    }

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

    /**
     * After save/delete, recompute the work order's pay_status.
     */
    protected static function booted(): void
    {
        $sync = function (self $payment) {
            if (! $payment->work_order_id) {
                return;
            }
            $wo = WorkOrder::withoutGlobalScopes()->find($payment->work_order_id);
            if (! $wo) {
                return;
            }
            $paid = (float) static::withoutGlobalScopes()
                ->where('work_order_id', $wo->id)
                ->whereNull('deleted_at')
                ->sum('amount');
            $total = (float) $wo->total;

            if ($paid <= 0) {
                $wo->pay_status = 'unpaid';
            } elseif ($paid + 0.01 < $total) {
                $wo->pay_status = 'partial';
            } else {
                $wo->pay_status = 'paid';
            }
            $wo->save();
        };

        static::saved($sync);
        static::deleted($sync);

        // Auto-send confirmation email on new payment.
        static::created(function (self $payment) {
            app(\App\Services\NotificationDispatcher::class)->paymentReceived($payment);
        });
    }
}
