<?php

namespace app\admin\model;

use support\Db;
use support\Model;

/**
 * 分类模型
 * Class Users
 * @package app\admin\model
 */
class Category extends Model
{
    const STATUS_DEL_NO = '0';
    const STATUS_DEL_YES = '1';
    const STATUS_DEL = [
        self::STATUS_DEL_NO => '正常',
        self::STATUS_DEL_YES => '删除'
    ];

    const CATEGORY_RECOMMEND_NO = '0';
    const CATEGORY_RECOMMEND_YES = '1';
    const CATEGORY_SHOW = [
        self::CATEGORY_RECOMMEND_NO => '不推荐',
        self::CATEGORY_RECOMMEND_YES => '推荐'
    ];

    /**
     * The table associated with the model.
     *
     * @var string
     */
    protected $table = 'category';

    public $timestamps = false;

    /**
     * Notes:模型关联
     * @return \Illuminate\Database\Eloquent\Relations\HasMany
     * User: yym
     * Date: 2022/11/4
     */
    public function children()
    {
        return $this->hasMany(Category::class, 'category_pid', 'category_id')->where(['category_del' => Category::STATUS_DEL_NO])->select(['category_id', 'category_pid', 'category_name', 'category_icon', 'category_type', 'category_open_type', 'category_open_url', 'category_recommend', 'category_sort', Db::raw('FROM_UNIXTIME(category_create_time) as category_create_time')])->orderBy('category_sort', 'desc');
    }
    /**
     * Notes:获取菜单列表
     * @param string $keywords
     * @param int $page
     * @param int $limit
     * @return array
     * User: ZQ
     * Date: 2022/9/14
     */
    public static function getCategoryList(string $keywords)
    {
        return static::select(['*', Db::raw('FROM_UNIXTIME(category_create_time) as category_create_time')])->where(['category_del' => static::STATUS_DEL_NO])
            ->when($keywords != '', function ($query) use ($keywords){
                $query->where('category_name', 'like', '%' . $keywords . '%');
            })
            ->when($keywords == '', function ($query) use ($keywords){
                $query->where('category_pid', 0);
            })
            ->with(['children' => function($query){
                $query->with(['children' => function($query1){
                    $query1->with(['children' => function($query2){
                        $query2->with(['children' => function($query3){
                            $query3->with(['children' => function($query4){
                                $query4->with(['children']);
                            }]);
                        }]);
                    }]);
                }]);
            }])
            ->orderBy('category_sort','DESC')
            ->orderBy('category_create_time','DESC')
            ->get()
            ->toArray();
    }

    /**
     * Notes:获取菜单
     * @param int $category_pid
     * @return array
     * User: ZQ
     * Date: 2022/9/13
     */
    public static function getCategorys(int $category_pid)
    {
        $list = static::select('*')
            ->where(['category_pid' => $category_pid, 'category_del' => static::STATUS_DEL_NO])
            ->orderBy('category_sort','DESC')
            ->get();
        return $list;
    }

    /**
     * Notes:三级菜单
     * @param int $category_pid
     * @return array
     * User: ZQ
     * Date: 2022/9/15
     */
    public static function getLevel($category_pid)
    {
        $list = static::select(['category_id as value','category_name as label'])
            ->where(['category_pid' => $category_pid, 'category_del' => static::STATUS_DEL_NO])
            ->orderBy('category_sort','DESC')
            ->get();
        return $list;
    }

    /**
     * Notes:获取菜单
     * @param int $categorys
     * @return array
     * User: ZQ
     * Date: 2022/9/13
     */
    public static function categorysMation($categorys)
    {
        $list = static::where(['category_del'=>static::STATUS_DEL_NO])
            ->when($categorys != '', function ($query) use ($categorys){
                $query->whereIn('category_id', $categorys);
            })
            ->get();
        return $list;
    }

    /**
     * Notes:获取角色对应权限菜单
     * @param array $category_ids
     * @return array
     * User: yym
     * Date: 2022/9/21
     */
    public static function getCategoryListRule(array $category_ids)
    {
        return static::where(['category_del' => static::STATUS_DEL_NO])
            ->whereIn('category_id', $category_ids)
            ->get()
            ->toArray();
    }

    /**
     * Notes:菜单列表
     * @param array $category_list_ids
     * @return array
     * User: yym
     * Date: 2022/9/21
     */
    public static function getHomeCategoryList(array $category_list_ids)
    {
        $where = array(
            'category_del' => static::STATUS_DEL_NO,
            'level' => STATIC::MENU_LEVEL_ONE
        );
        return static::where($where)
            ->select(['category_id', 'category_pid', 'category_path', 'category_icon', 'category_name', 'category_route'])
            ->when(!empty($category_list_ids), function ($query) use ($category_list_ids){
                $query->whereIn('category_id', $category_list_ids);
            })
            ->with(['children' => function($query) use ($category_list_ids){
                $query->with('children')->when(!empty($category_list_ids), function ($query1) use ($category_list_ids){
                    $query1->whereIn('category_id', $category_list_ids);
                });
            }])
            ->get()
            ->toArray();
    }

    /**
     * Notes:查询指定条件下的某个字段内容
     * @param int $category_id
     * @param string $field
     * User: yym
     * Date: 2022/9/27
     */
    public static function getParentValue(int $category_id, string $field = 'level')
    {
        return static::where(['category_id' => $category_id])->value($field);
    }

    /**
     * Notes:获取父级菜单编号 处理成数组形式
     * @param int $category_pid
     * @return array|false|mixed
     * User: yym
     * Date: 2022/9/26
     */
    public function getParentCategoryId(int $category_pid)
    {
        $parent = array();
        $parent = $this->getParentPid($category_pid);
        if(!empty($parent))
        {
            $parent = array_merge([$category_pid], $parent);
            array_pop($parent);
        }
        return array_reverse($parent);
    }

    /**
     * Notes:递归查询父级ID
     * @param $category_id
     * @param array $date
     * @return array|false|mixed
     * User: yym
     * Date: 2022/9/26
     */
    public function getParentPid($category_id, $date=[]){
        if(empty($category_id) && empty($date))
        {
            return array();
        }
        if(empty($category_id) && !empty($date)){
            return $date;
        }

        $parentIds = array();
        $parentIds = Category::select('category_pid')->where(['category_id' => $category_id, 'category_del' => Category::STATUS_DEL_NO])->get()->toArray();

        $subIds = array();
        $subIds = array_column($parentIds, 'category_pid');
        $subIds = array_unique($subIds);

        if(count($subIds)>0)
        {
            foreach($subIds as $val)
            {
                $date[] = $val;
                $date = $this->getParentPid($val, $date); //注意写$date 返回给上级
            }
        }
        if(count($date)>0)
        {
            return $date;
        }else{
            return false;
        }
    }

}
