<?php

namespace App\Models;

use App\Models\Enums\ProjectACL;
use App\Models\Scopes\CompanyScope;
use function DragonCode\Support\Instances\when;
use EloquentFilter\Filterable;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\SoftDeletes;
use Illuminate\Support\Facades\Auth;

class Project extends Model
{
    use HasFactory, Filterable,SoftDeletes;

    protected $fillable = [
        "name","code","const","status","begin","end","latitude","longitude","type","acl","whitelist","description","cost_unit"
    ];

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

    /**
     * ACL 访问控制作用域
     *
     * @param Builder $query
     * @param string $id 单个操作时使用,限制范围
     * @return void
     */
    public function scopeAllowed(Builder $query, string $id = null,bool $isAction=false): void
    {
        $projectIds = Project::query()->leftJoin("team_members", "projects.id", "=", "team_members.project_id")
            ->when($id == null, fn($query) => $query->filter(request()->query()))
            ->when($isAction===false,fn($query)=>$query->filter(request()->query()))
            ->when($id, fn($query) => $query->where("projects.id", $id))
            ->when($isAction,fn($query)=>$query->where(function ($query){
                 $query->where("team_members.user_id", Auth::id())->where('team_members.limited',1);
            }))
            ->where(function ($query) {
                $query->where("team_members.user_id", Auth::id())
                    ->orWhere(fn($query) => $query->where("projects.acl", ProjectACL::CUSTOM->value)->where("whitelist", "like", "%,".Auth::id().",%"));
            })
            ->pluck("projects.id")
            ->unique();

        $query->whereIn("id", $projectIds->toArray());
    }

    public function plans(): \Illuminate\Database\Eloquent\Relations\BelongsToMany
    {
        return $this->belongsToMany(Plan::class, 'project_plan')->withTrashed();
    }

    public function assets(): \Illuminate\Database\Eloquent\Relations\BelongsToMany
    {
        return $this->belongsToMany(Asset::class, 'project_asset')->withTrashed();
    }

    public function requirements(): \Illuminate\Database\Eloquent\Relations\BelongsToMany
    {
        return $this->belongsToMany(Requirement::class, 'project_requirement');
    }

    public function teamMembers(): \Illuminate\Database\Eloquent\Relations\HasMany
    {
        return $this->hasMany(TeamMember::class);
    }

    public function tasks(): \Illuminate\Database\Eloquent\Relations\HasMany
    {
        return $this->hasMany(Task::class);
    }

    public function requirementsGroup(): \Illuminate\Database\Eloquent\Relations\BelongsToMany
    {
        return $this->belongsToMany(RequirementGroup::class, 'project_requirement');
    }

    public function library(){
        return $this->hasMany(Library::class ,'project_id')->where('type', 'project');
    }
}