<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\BelongsTo;
use Illuminate\Database\Eloquent\Relations\BelongsToMany;
use Illuminate\Database\Eloquent\Relations\MorphMany;

class Sale extends Model
{
    use HasFactory;

    protected $fillable = [
        'branch_id',
        'user_id',
        'client_id',
        'happened_on',
        'reference_number',
        'buyer'
    ];

    protected $casts = [
        'happened_on' => 'date:Y-m-d',
    ];

    /**
     * Get all the transactions for the Sale
     */
    public function transactions(): MorphMany
    {
        return $this->morphMany(Transaction::class, 'transactionable');
    }

    protected static function booted()
    {
        static::deleting(function ($sale) {
            $sale->transactions->each(function ($transaction) {
                // Delete associated ledgers first to trigger any ledger deletion logic if exists
                $transaction->ledgers->each(function ($ledger) {
                    $ledger->balances()->delete(); // Delete balances associated with ledger
                    $ledger->delete();
                });
                $transaction->delete();
            });
        });
    }

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

    public function accounts(): BelongsToMany
    {
        return $this->belongsToMany(Account::class, 'account_sale')->withTimestamps();
    }

    public function getAccountsListAttribute(): string
    {
        return $this->accounts->pluck('account')->implode(', ');
    }

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