<?php

namespace App\Models;

use App\Models\Enums\AssetACL;
use App\Models\Scopes\CompanyScope;
use EloquentFilter\Filterable;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Support\Facades\Auth;

/**
 * @method static \Illuminate\Database\Eloquent\Builder allowed()
 */
class Asset extends Model
{
    use HasFactory, Filterable;

    protected $fillable = [
        "name", "code", "description", "company_id", "status", "created_by",
        "owner", "address", "group_id", "geo_address_code", "acl",
        "whitelist", "latitude", "longitude","parent_id", "path",
        "equity_interest","developer","date_completed","total_floor_area","contact_person","contact_phone","contact_email","property","building_type_description"
    ];

    protected static function booted(): void
    {
        static::addGlobalScope(new CompanyScope);
    }

    public function scopeAllowed(Builder $query): void
    {
        $query->where(function (Builder $query) {
            return $query->where('acl', AssetACL::PRIVATE->value)->where('owner', Auth::id());
        })->orWhere(function (Builder $query) {
            return $query->where('acl', AssetACL::CUSTOM->value)->where('whitelist', 'like', '%,' . Auth::id() . ',%');
        });
    }

    public function children(){
        return $this->hasMany(Asset::class ,'parent_id');
    }
    public function parent(){
        return $this->belongsTo(Asset::class ,'parent_id');
    }

    public function requirementGroups(){
        return $this->hasMany(RequirementGroup::class ,'asset_id');
    }

    public function requirements(){
        return $this->hasMany(Requirement::class ,'asset_id');
    }

    public function plans(){
        return $this->hasMany(Plan::class ,'asset_id');
    }

    public function projects(){
        return $this->belongsToMany(Project::class,'project_asset');
    }

    //获取子级需求数量
    public function getTotalRequirementsCountAttribute()
    {
        $totalRequirementsCount = $this->requirements()->count(); // 当前资产的需求数量

        foreach ($this->children as $child) {
            $totalRequirementsCount += $child->getTotalRequirementsCountAttribute(); // 递归调用子资产的方法
        }

        return  $totalRequirementsCount;
    }

    //获取子级计划数量
    public function getTotalPlansCountAttribute()
    {
        $totalPlansCount = $this->plans()->count(); // 当前资产的需求数量

        foreach ($this->children as $child) {
            $totalPlansCount += $child->getTotalPlansCountAttribute(); // 递归调用子资产的方法
        }

        return  $totalPlansCount;
    }

}