<?php

declare(strict_types=1);

namespace App\Models;

use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\BelongsTo;

/**
 * Себестоимость каждого лида (Ю-2: реселлерская модель).
 *
 * Партиционирована по `received_at` синхронно с `deals` — composite PK
 * (id, received_at). Создаётся в `LedgerService::chargeForDelivery` в той же
 * транзакции, что и Deal + BalanceTransaction.
 *
 * cost_rub — snapshot suppliers.cost_rub на момент приёма (исторические
 * записи не пересчитываются при изменении закупочной цены, см. §20.12.5).
 *
 * Источник: db/schema.sql v8.7 §8.5, table `supplier_lead_costs`.
 *
 * @mixin IdeHelperSupplierLeadCost
 */
class SupplierLeadCost extends Model
{
    public $timestamps = false;

    protected $table = 'supplier_lead_costs';

    protected $fillable = [
        'deal_id',
        'received_at',
        'supplier_id',
        'cost_rub',
        'supplier_lead_id',
        'supplier_invoice_id',
        'created_at',
    ];

    protected function casts(): array
    {
        return [
            'deal_id' => 'integer',
            'supplier_id' => 'integer',
            'cost_rub' => 'decimal:2',
            'supplier_lead_id' => 'integer',
            'supplier_invoice_id' => 'integer',
            'received_at' => 'datetime',
            'created_at' => 'datetime',
        ];
    }

    /**
     * Composite PK (id, received_at) — партиционированная таблица.
     */
    protected function setKeysForSaveQuery($query)
    {
        return $query
            ->where('id', $this->getAttribute('id'))
            ->where('received_at', $this->getAttribute('received_at'));
    }

    /** @return BelongsTo<Supplier, $this> */
    public function supplier(): BelongsTo
    {
        return $this->belongsTo(Supplier::class);
    }
}
