<?php


namespace App\Services;

use App\Services\BaseService;
use App\Models\Role;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Collection;
use Illuminate\Support\Facades\Cache;
use App\Services\RoleMenuService;   


/**
 * 菜单
 */
class RoleService extends BaseService
{
    public static string $MODEL = Role::class;
    /**
     * @description: 模型
     * @return {string}
     */
    public static function model(): string
    {
        return Role::class;
    }

    /**
     * @description: 枚举
     * @return {*}
     */
    public static function enum(): string
    {
        return '';
    }

    /**
     * @description: 获取查询条件
     * @param {array} $search 查询内容
     * @return {array}
     */
    public static function getWhere(array $search = []): array
    {
        $where = [];
       
        if (isset($search['id']) && !empty($search['id'])) {
            $where[] = ['id', '=', $search['id']];
        }
        if (isset($search['ids']) && !empty($search['ids'])) {
            $where[] = ['id', 'in', $search['ids']];
        }
        if (isset($search['name']) && !empty($search['name'])) {
            $where[] = ['name', '=', $search['name']];
        }
        if (isset($search['display_name']) && !empty($search['display_name'])) {
            $where[] = ['display_name', 'like', '%'.$search['display_name'].'%'];
        }
       
        return $where;
    }

    /**
     * @description: 查询单条数据
     * @param array $search
     * @return \App\Models\Coin|null
     */
    public static function findOne(array $search): ?Role
    {
        return self::model()::with(['menus'])->where(self::getWhere($search))->first();
    }

    /**
     * @description: 查询所有数据
     * @param array $search
     * @return \Illuminate\Database\Eloquent\Collection
     */
    public static function findAll(array $search = [])
    {
        
        return self::model()::with(['menus'])->where(self::getWhere($search))->get();
        
    }

    /**
     * @description: 分页查询
     * @param array $search
     * @return \Illuminate\Contracts\Pagination\LengthAwarePaginator
     */
    public static function paginate(array $search = [])
    {
        $limit = isset($search['limit']) ? $search['limit'] : 15;
        $paginator = self::model()::with(['menus'])->where(self::getWhere($search))
            // ->orderBy("sort", 'asc')
            ->paginate($limit);
        return ['total' => $paginator->total(), 'data' => $paginator->items()];
    }

    /**
     * @description: 
     * @param {*} $params
     * @return {*}
     */    
    public static function submit($params = [])
    {
        $result = false;
        $msg['code'] = self::NOT;
        $msg['msg'] = '';
        
        // 2. 判断是否是更新
        if (!empty($params['id'])) {
            // 更新
            $info = self::findOne(['id'=>$params['id']] );
            if (!$info) {
                $msg['msg'] = '角色不存在！';
            }else{
                $result = $info->update($params);
                $id = $params['id'];
            }

        } else {
            // 创建
            $result = $info = self::model()::create($params);
            $id = $result->id;
        }
        
       
        if($result){
            if(is_array($params['menus_ids'])){
                $menus = $params['menus_ids'];
            }else{
                if(empty($params['menus_ids'])){
                    $menus = [];
                }else{
                    $menus = explode(',',$params['menus_ids']);
                }
                
            }
            RoleMenuService::submit($id,$menus);
           $msg['code'] = self::YES;
           $msg['msg'] = '设置成功';
        }else{
            $msg['msg'] = empty($msg['msg']) ?'操作失败':$msg['msg'];
        }

        return $msg;
    }
}