<?php

declare(strict_types=1);

namespace App\Controller;

use App\JsonRpc\AuthorityServiceInterface;
use App\Tools\PublicData;
use Hyperf\Di\Annotation\Inject;
use Hyperf\HttpServer\Annotation\AutoController;
use App\Tools\Result;
use App\Constants\ErrorCode;
use Hyperf\Validation\Contract\ValidatorFactoryInterface;
use Hyperf\Context\Context;
/**
 * Class AuthorityController
 * @package App\Controller
 */
//#[AutoController]
class AuthorityController extends AbstractController
{
    #[Inject]
    protected ValidatorFactoryInterface $validationFactory;
    /**
     * @var AuthorityServiceInterface
     */
    #[Inject]
    private $authorityServiceClient;

    /**
     * 获取菜单列表
     * @return array
     */
    public function getMenuList()
    {
        $result = $this->authorityServiceClient->getMenuList([]);
        $result =  PublicData:: buildMenuTree($result['data']);
        return $result?Result::success($result):Result::error('查询失败');
    }

    /**
     * 删除菜单
     * @return array
     */
    public function delMenu()
    {
        $requireData = $this->request->all();
        $validator = $this->validationFactory->make(
            $requireData,
            [
                'id' => 'required',
            ],
            [
                'id.required' => '菜单id不能为空',
            ]
        );
        if ($validator->fails()){
            $errorMessage = $validator->errors()->first();
            return Result::error($errorMessage);
        }
        $getData = [
            'id'=>$requireData['id']
        ];
        $result = $this->authorityServiceClient->getMenuList($getData);
//        var_dump("菜单返回数据:",$result);
        if(count($result['data'])>0){
            return Result::error("有子菜单不能删除");
        }
        $data = ['id'=>$requireData['id']];
        return $this->authorityServiceClient->delMenu($data);

    }

    /**
     * 添加菜单
     * @return array|void
     */
    public function addMenu()
    {
        $requireData = $this->request->all();
        $validator = $this->validationFactory->make(
            $requireData,
            [
                'label' => 'required',
            ],
            [
                'label.required' => '菜单名称不能为空',
            ]
        );
        if ($validator->fails()){
            $errorMessage = $validator->errors()->first();
            return Result::error($errorMessage);
        }
        $requireData['pid'] = isset($requireData['pid_arr'])?end($requireData['pid_arr']):'';
        $requireData['pid_arr'] = isset($requireData['pid_arr'])?json_encode($requireData['pid_arr']):'';

        $result = $this->authorityServiceClient->addMenu($requireData);
        return $result?Result::success($result['data']):Result::error($result['message']);
    }

    /**
     * 查看菜单信息
     * @return array
     */
    public function getMenuInfo()
    {
        $requireData = $this->request->all();
        $validator = $this->validationFactory->make(
            $requireData,
            [
                'id' => 'required',
            ],
            [
                'id.required' => 'id不能为空',
            ]
        );
        if ($validator->fails()){
            $errorMessage = $validator->errors()->first();
            return Result::error($errorMessage);
        }
        $result = $this->authorityServiceClient->getMenuInfo($requireData);
        $result['data']['pid_arr'] = isset($result['data']['pid_arr']) && $result['data']['pid_arr']?json_decode($result['data']['pid_arr']):[];
        return $result?Result::success($result['data']):Result::error($result['message']);
    }
    /**
     * 修改菜单
     * @return array|void
     */
    public function updateMenu()
    {
        $requireData = $this->request->all();
        $validator = $this->validationFactory->make(
            $requireData,
            [
                'id' => 'required',
                'label' => 'required',
            ],
            [
                'id.required' => 'id不能为空',
                'label.required' => '菜单名称不能为空',
            ]
        );
        if ($validator->fails()){
            $errorMessage = $validator->errors()->first();
            return Result::error($errorMessage);
        }
        $requireData['pid'] = isset($requireData['pid_arr'])?end($requireData['pid_arr']):'';
        $requireData['pid_arr'] = isset($requireData['pid_arr'])?json_encode($requireData['pid_arr']):'';
        $result = $this->authorityServiceClient->updateMenu($requireData);
        return $result?Result::success($result['data']):Result::error($result['message']);
    }

    /**
     * 菜单递归查询处理
     * @return void
     */
    public  function  getRecursionMenu()
    {
        $reqData = [
            'user_id' =>Context::get("UserId"),
        ];
        $result =  $this->authorityServiceClient->getRecursionMenu($reqData);
        $rep = PublicData::buildMenuTree($result['data']);
        return $rep?Result::success($rep):Result::error("查询失败");
    }

    /**
     * 查询所有的菜单
     * @return array
     */
    public function getAllMenuList()
    {
        $result =  $this->authorityServiceClient->getAllMenuList([]);
        $rep = PublicData::buildMenuTree($result['data']);
        return $rep?Result::success($rep):Result::error("查询失败");
    }

}