<?php

declare(strict_types=1);

namespace App\Models;

use App\ValueObjects\Money;
use Carbon\Carbon;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\BelongsTo;

/**
 * Linea individual de una distribucion de utilidades.
 *
 * Captura un snapshot del estado del socio al momento de la distribucion:
 * - ownership_percentage: Porcentaje de participacion al momento
 * - capital_at_distribution: Capital neto del socio al momento
 * - gross_amount: Monto bruto que le corresponde
 * - retained_amount: Monto retenido (reinversion)
 * - net_amount: Monto neto a pagar
 *
 * @property int $id
 * @property int $profit_distribution_id
 * @property int $partner_id
 * @property string $ownership_percentage
 * @property string $capital_at_distribution
 * @property string $gross_amount
 * @property string $retained_amount
 * @property string $net_amount
 * @property bool $is_paid
 * @property Carbon|null $paid_at
 * @property string|null $payment_method
 * @property string|null $payment_reference
 * @property int|null $withdrawal_id
 */
class ProfitDistributionLine extends Model
{
    protected $fillable = [
        'profit_distribution_id',
        'partner_id',
        'ownership_percentage',
        'capital_at_distribution',
        'gross_amount',
        'retained_amount',
        'net_amount',
        'is_paid',
        'paid_at',
        'payment_method',
        'payment_reference',
        'withdrawal_id',
    ];

    protected $casts = [
        'ownership_percentage' => 'decimal:4',
        'capital_at_distribution' => 'decimal:2',
        'gross_amount' => 'decimal:2',
        'retained_amount' => 'decimal:2',
        'net_amount' => 'decimal:2',
        'is_paid' => 'boolean',
        'paid_at' => 'date',
    ];

    protected $attributes = [
        'retained_amount' => '0.00',
        'is_paid' => false,
    ];

    // ═══════════════════════════════════════════════════════════════════════
    // RELATIONSHIPS
    // ═══════════════════════════════════════════════════════════════════════

    public function distribution(): BelongsTo
    {
        return $this->belongsTo(ProfitDistribution::class, 'profit_distribution_id');
    }

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

    public function withdrawal(): BelongsTo
    {
        return $this->belongsTo(PartnerWithdrawal::class, 'withdrawal_id');
    }

    // ═══════════════════════════════════════════════════════════════════════
    // HELPERS
    // ═══════════════════════════════════════════════════════════════════════

    public function getNetAmountMoney(): Money
    {
        return Money::of($this->net_amount);
    }

    public function getGrossAmountMoney(): Money
    {
        return Money::of($this->gross_amount);
    }
}
