<?php

namespace App\Models;

use App\Observers\BranchObserver;
use Illuminate\Database\Eloquent\Attributes\ObservedBy;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\BelongsTo;
use Illuminate\Database\Eloquent\Relations\HasMany;
use Znck\Eloquent\Traits\BelongsToThrough;

#[ObservedBy(BranchObserver::class)]
class Branch extends Model
{
    use BelongsToThrough;
    use HasFactory;

    protected $guarded = [];

    public function getCurrentSeriesAttribute()
    {
        if ($this->series()->count() > 0) {
            return $this->series()->orderBy('id', 'desc')->first()->series;
        }

        return null;
    }

    /**
     * Get all of the series for the Branch
     */
    public function series(): HasMany
    {
        return $this->hasMany(Series::class);
    }

    public function getIsClientVatableAttribute(): bool
    {
        return $this->client->vatable;
    }

    /**
     * Get the client that owns the Branch
     */
    public function client(): BelongsTo
    {
        return $this->belongsTo(Client::class);
    }

    /**
     * Get all the sales for the Branch
     */
    public function sales(): HasMany
    {
        return $this->hasMany(Sale::class);
    }

    /**
     * Get all the expenses for the Branch
     */
    public function expenses(): HasMany
    {
        return $this->hasMany(Expense::class);
    }

    public function balances(): HasMany
    {
        return $this->hasMany(Balance::class);
    }

    public function accounts(): \Znck\Eloquent\Relations\BelongsToThrough
    {
        return $this->belongsToThrough(Account::class, Balance::class);
    }

    public function transactions(): HasMany
    {
        return $this->hasMany(Transaction::class);
    }
}
