<?php
declare (strict_types = 1);

namespace app\bug\controller;

use app\bug\model\UserRole;
use app\user\model\Account;
use think\App;
use think\facade\Validate;
class User extends Base
{
	protected $noLogin=[];
	public function __construct(App $app) {
		parent::__construct($app);
		$this->model= new UserRole();
	}
    public function setRole(){
        $post  =$this->request->param(["id"=>"","roleid"=>""],"post","trim");
        $valid = Validate::rule([
        	"id|用户id"=>"require|number|gt:0",
        	"roleid|角色id"=>"require|number|gt:0",
        	]);
        if($valid->check($post)== false) return error($valid->getError());
        $isRole = \app\bug\model\Role::where("id",$post['roleid'])->findOrEmpty();
        if($isRole->isEmpty())return error("所选角色不存在");
        if($isRole->status==0)return error("所选角色已禁用");
        $info = $this->model->where(["uid"=>$post['id'],"roleid"=>$post['roleid'],"is_del"=>0])->findOrEmpty();
        $info->uid=$post['id'];
        $info->roleid=$post['roleid'];
        $info->status=1;
        $insert =  $info->save();
        return $insert? success('角色设置成功'):error('角色设置失败');
    }

    /**
     * 显示资源列表
     *
     * @return \think\Response
     */
    public function list()
    {
        $post  =$this->request->param(["page"=>1,"size"=>10,"nickname"=>"",'username'=>'','level'=>'','itemid'=>'',"sys_status"=>""],"post","trim");
        $where=[["is_del","=",0]];
        if($post['nickname']!='') $where[]=["userInfo.nickname","like","%{$post['nickname']}%"];
        if($post['username']!='') $where[]=["username","like","%{$post['username']}%"];
        if($post['sys_status']!==''){
        	$uidArr = UserRole::where(["status"=>1,"is_del"=>0])->column("uid");
        	if($post['sys_status']==1){
        		$where[]=['account.id','in',$uidArr];
        	}else{
        		$where[]=['account.id','not in',$uidArr];
        	}
        }
        
        if($post['level']!=0) $where[]=['level','=',$post['level']];
         if($post['itemid']!=0) $where[]=['accountItem.itemid','=',$post['itemid']];
        $account = new Account();
        $list=$account->with(["accountItem"=>["itemName"],'company_relaton'])->withJoin(["userInfo","account_item"],"left")
        ->where($where)->order("account.id desc")
        ->paginate(["list_rows"=>$post['size'],"page"=>$post['page']]);
        $uidArr =array_column($list->items(),"id");
        $roleArr=(new UserRole())->RoleInfoByUid($uidArr);
        $list->hidden(['userInfo',"password",'salt','openId',"accountItem",'account_item']);
        foreach ($list->items() as &$item){
        	$item['roleid'] = '0';
            $item['role_name'] = '';
            $item['sys_status'] = '0';
            if(isset($roleArr[$item->id])){
            	  $item['roleid'] =$roleArr[$item->id]->roleid;
            	  $item['role_name'] = $roleArr[$item->id]->role_name??"";
            	  $item['sys_status'] = $roleArr[$item->id]->status;
            }
        }
        return success("获取成功",["list"=>$list->items(),"count"=>$list->total()]);
    }

    /**
     * @param token
     * @return \think\response\Json
     * @throws \think\exception\DbException
     */
    public function userInfo(){
    	$uid  =$this->request->post("id/d");
        $account = new Account();
        $info=$account->with(['company_relaton',"userInfo",'accountItem'=>['itemName']])->findOrEmpty($uid);
        $roleArr=(new UserRole())->RoleInfoByUid($uid);
        $info['roleid'] = '0';
        $info['role_name'] = '';
        $info['sys_status'] = '0';
        if(isset($roleArr[$uid])){
	       $info['roleid'] =$roleArr[$uid]->roleid;
	       $info['role_name'] = $roleArr[$uid]->role_name;
	       $info['sys_status'] = $roleArr[$uid]->status;
       }
        return success("获取成功",$info);
    }
    public  function  userAll(){
        $post  =$this->request->param(['username'=>"",'level'=>0,'itemid'=>0,'nickname'=>'',"sys_status"=>""],"post","trim");
        $where=[['is_del','=',0]];
        if($post['nickname']!='') $where[]=['userInfo.nickname','like',"%{$post['nickname']}%"];
        if($post['username']!='') $where[]=['username','like',"%{$post['username']}%"];
        if($post['level']!=0) $where[]=['level','=',$post['level']];
        if($post['sys_status']!==''){
        	$uidArr = UserRole::where(['status'=>1,'is_del'=>0])->column('uid');
        	if($post['sys_status']==1){
        		$where[]=['account.id','in',$uidArr];
        	}else{
        		$where[]=['account.id','not in',$uidArr];
        	}
        }
         if($post['itemid']!=0) $where[]=['accountItem.itemid','=',$post['itemid']];
        $account = new Account();
        $list=$account->with(['company_relaton','accountItem'=>['itemName']])->withJoin(['userInfo','account_item'],'left')
        ->where($where)->order('account.id desc')->hidden(['userInfo','password','salt','openId',"accountItem",'account_item'])
        ->select();
        $uidArr =array_column($list->toArray(),'id');
        $roleArr=(new UserRole())->RoleInfoByUid($uidArr);
        foreach ($list as &$item){
        	$item['roleid'] = '0';
            $item['role_name'] = '';
            $item['sys_status'] = '0';
            if(isset($roleArr[$item->id])){
            	$item['roleid'] =$roleArr[$item->id]->roleid;
            	$item['role_name'] = $roleArr[$item->id]->role_name;
            	$item['sys_status'] = $roleArr[$item->id]->status;
            }
        }
        return success('获取成功',$list);
    }

    /**
     * 保存新建的资源
     *
     * @param  \think\Request  $request
     * @return \think\Response
     */
    public function UserSave()
    {
        $post=$this->request->param(["id"=>"","nickname"=>"","mobile"=>"","role"=>"",'sys_status'=>'','itemid'=>""],"post","trim");
        $valid=Validate::rule([
        	'id|用户id'=>'require|number|gt:0',
        	'nickname|用户昵称'=>'require|max:255',
        	'mobile|用户手机号'=>'require|mobile',
        	'role|用户角色'=>'number|egt:0',
        	'sys_status|状态'=>'requireWith:role|number|in:0,1',
        	'itemid|部门'=>'number|egt:0',
        	]);
        if($valid->check($post)==false) return error($valid->getError());
        $userInfo = Account::where(["id"=>$post['id'],'is_del'=>0])->findOrEmpty();
        if($userInfo->isEmpty())return error('账户不存在');
        $userrole = $this->model->where(['uid'=>$post['id'],'is_del'=>0])->findOrEmpty();
        if($post['role']!=0){
            $roleinfo =\app\bug\model\Role::where("id",$post['role'])->findOrEmpty();
            if($roleinfo->isEmpty())return error("角色不存在");
            if($roleinfo->status==0)return error("角色已禁用");
        }
		
       $this->model->startTrans();
        try{
        	if($userrole->isEmpty()){
        		if($post['role']!=0){
        			$userrole->uid=$post['id'];
        			$userrole->roleid=$post['role'];
        			$userrole->status=$post['sys_status'];
        		}
        	}else{
        		$userrole->roleid=$post['role'];
        	    $userrole->status=$post['sys_status'];
        	}
        	if($userrole->isEmpty()==false) {
        		$userUp=$userrole->save();
        		if($userUp==false) throw new \Exception("角色设置失败");
        	}
        	$change=["mobile"=>$post['mobile'],"nickname"=>$post['nickname'],'itemid'=>$post['itemid']];
        	$userInfo->changeAccount($post['id'],$change);
        	$this->model->commit();
        	return success("账户设置成功");
        }catch(\Exception $e){
            $this->model->rollback();
            return error($e->getMessage());
        }
    }

    public function UserStatus()
    {
        $post=$this->request->param(["id"=>"","sys_status"=>"",'plat'=>''],"post","trim");
        $valid=Validate::rule([
        	"id|用户id"=>"require|number|gt:0",
        	"sys_status|状态"=>"require|number|in:0,1",
        	"plat|平台"=>"number|in:0,1,2,3"
        	]);
        if($valid->check($post)==false) return error($valid->getError());
        $message = $post['sys_status']==1?"启用":"禁用";
        $item = UserRole::where(['uid'=>$post['id']])->findOrEmpty();
        if($item->isEmpty() && $post['sys_status']==1) return error("账户请先设置角色再启用");
        $item->status=$post['sys_status'];
        $var = $item->save();
        if($var==false)return error("角色{$message}失败");
        return success("角色{$message}成功");
    }
}