<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\SoftDeletes;
use Encore\Admin\Traits\ModelTree;
use Encore\Admin\Traits\AdminBuilder;
//use Encore\Admin\Auth\Database\Role;
use Illuminate\Database\Eloquent\Relations\BelongsToMany;
use Encore\Admin\Facades\Admin;
use Illuminate\Foundation\Auth\User;
use App\Models\ArticleCategoryRole;
use App\Models\Role;

/**
 * App\Models\ArticleCategory
 *
 * @property int $id
 * @property string $category_name 分类名称
 * @property int $parent_id 分类父id
 * @property int $list_order 排序
 * @property string|null $title 标题
 * @property string|null $keywords 关键字
 * @property string|null $description 描述
 * @property int $admin_set 是否为系统自带(1是0否)
 * @property \Illuminate\Support\Carbon|null $created_at
 * @property \Illuminate\Support\Carbon|null $updated_at
 * @property string|null $deleted_at
 * @property-read \Illuminate\Database\Eloquent\Collection|\App\Models\ArticleCategory[] $children
 * @property-read \App\Models\ArticleCategory $parent
 * @property-read \Illuminate\Database\Eloquent\Collection|\Encore\Admin\Auth\Database\Role[] $roles
 * @method static bool|null forceDelete()
 * @method static \Illuminate\Database\Eloquent\Builder|\App\Models\ArticleCategory newModelQuery()
 * @method static \Illuminate\Database\Eloquent\Builder|\App\Models\ArticleCategory newQuery()
 * @method static \Illuminate\Database\Query\Builder|\App\Models\ArticleCategory onlyTrashed()
 * @method static \Illuminate\Database\Eloquent\Builder|\App\Models\ArticleCategory query()
 * @method static bool|null restore()
 * @method static \Illuminate\Database\Eloquent\Builder|\App\Models\ArticleCategory whereAdminSet($value)
 * @method static \Illuminate\Database\Eloquent\Builder|\App\Models\ArticleCategory whereCategoryName($value)
 * @method static \Illuminate\Database\Eloquent\Builder|\App\Models\ArticleCategory whereCreatedAt($value)
 * @method static \Illuminate\Database\Eloquent\Builder|\App\Models\ArticleCategory whereDeletedAt($value)
 * @method static \Illuminate\Database\Eloquent\Builder|\App\Models\ArticleCategory whereDescription($value)
 * @method static \Illuminate\Database\Eloquent\Builder|\App\Models\ArticleCategory whereId($value)
 * @method static \Illuminate\Database\Eloquent\Builder|\App\Models\ArticleCategory whereKeywords($value)
 * @method static \Illuminate\Database\Eloquent\Builder|\App\Models\ArticleCategory whereListOrder($value)
 * @method static \Illuminate\Database\Eloquent\Builder|\App\Models\ArticleCategory whereParentId($value)
 * @method static \Illuminate\Database\Eloquent\Builder|\App\Models\ArticleCategory whereTitle($value)
 * @method static \Illuminate\Database\Eloquent\Builder|\App\Models\ArticleCategory whereUpdatedAt($value)
 * @method static \Illuminate\Database\Query\Builder|\App\Models\ArticleCategory withTrashed()
 * @method static \Illuminate\Database\Query\Builder|\App\Models\ArticleCategory withoutTrashed()
 * @mixin \Eloquent
 */
class ArticleCategory extends Model
{
    use SoftDeletes,AdminBuilder,ModelTree {
        ModelTree::boot as treeBoot;
    }

    protected $table = 'article_categorys';

    public function __construct(array $attributes = [])
    {
        parent::__construct($attributes);
        $this->setParentColumn('parent_id');
        $this->setOrderColumn('list_order');
        $this->setTitleColumn('category_name');
    }
    public function parent()
    {
        return $this->belongsTo(ArticleCategory::class, 'parent_id', 'id');
    }
    public function children()
    {
        return $this->hasMany(ArticleCategory::class, 'parent_id', 'id');
    }
    public function roles() : BelongsToMany
    {
        $pivotTable = 'article_category_roles';
        $relatedModel = config('admin.database.roles_model');
        return $this->belongsToMany($relatedModel, $pivotTable, 'article_category_id', 'role_id');
    }
    protected static function boot()
    {
        static::treeBoot();

        static::deleting(function ($model) {
            $model->roles()->detach();
        });
    }
    protected static function categoryIds()
    {
        $is_admin = Admin::user()->isAdministrator();
        if ($is_admin) {
            $not_ids = null;
        } else {
            $user_roles = Admin::user()->roles->toArray();
            $roles_ids = array();
            if ($user_roles) {
                foreach ($user_roles as $k => $v) {
                    $roles_ids[] = $v['pivot']['role_id'];
                }
            }
            //获取对应的分类id
            $rst = ArticleCategoryRole::whereIn('role_id', $roles_ids)->get(array('article_category_id'))->toArray();
            $role_cates = array();
            if ($rst) {
                foreach ($rst as $k => $v) {
                    $role_cates[] = $v['article_category_id'];
                }
            }
            $not_cates = ArticleCategoryRole::whereNotIn('article_category_id', $role_cates)->get(array('article_category_id'))->toArray();
            $not_ids = array();
            if ($not_cates) {
                foreach ($not_cates as $k => $v) {
                    $not_ids[] = $v['article_category_id'];
                }
            }
        }

        return $not_ids;
    }

}