<?php

declare(strict_types=1);
namespace App\Controller;

use App\JsonRpc\ChatServiceInterface;
use App\Tools\PublicData;
use Hyperf\Di\Annotation\Inject;
use Hyperf\HttpServer\Annotation\AutoController;
use App\Tools\Result;
use Hyperf\Validation\Contract\ValidatorFactoryInterface;
use App\Amqp\Producer\DemoProducer;
use Hyperf\Context\ApplicationContext;
use App\Amqp\Producer;
use Hyperf\Snowflake\IdGeneratorInterface;
use PHPStan\Type\Accessory\OversizedArrayType;
use function Hyperf\Support\env;
use Hyperf\Context\Context;

/**
 *
 * Class ChatController
 * @package App\Controller
 */
//#[AutoController]
class ChatController extends AbstractController
{
    #[Inject]
    protected ValidatorFactoryInterface $validationFactory;
    /**
     * @var ChatServiceInterface
     */
    #[Inject]
    private  $chatServiceClient;

    /**
     * 申请添加好友
     * @return array
     */
    public function addContactApply()
    {
        $requireData = $this->request->all();
        $validator = $this->validationFactory->make(
            $requireData,
            [
                'friend_id' => 'required',
            ],
            [
                'friend_id.required' => '好友ID不能为空',
            ]
        );
        if ($validator->fails()){
            $errorMessage = $validator->errors()->first();
            return Result::error($errorMessage);
        }
        $requireData['user_id'] = Context::get("UserId");
        var_dump("用户id:",$requireData);
        $result = $this->chatServiceClient->addContactApply($requireData);
        return $result?Result::success($result['data']):Result::error($result['message']);
    }

    /**
     * 获取我的好友申请列表
     * @return array
     */
    public function getContactApplyList()
    {
        $requireData = [];
        $requireData['user_id'] =Context::get("UserId");
        $result = $this->chatServiceClient->getContactApplyList($requireData);
        return $result?Result::success($result['data']):Result::error($result['message']);
    }

    /**
     * 好有审核通过或拒绝
     * @return void
     */
    public function updateContactApply()
    {
        $requireData = $this->request->all();
        $validator = $this->validationFactory->make(
            $requireData,
            [
                'friend_id' => 'required',
                'type'=>'required'
            ],
            [
                'friend_id.required' => '好友ID不能为空',
                'type.required' => '操作状态不能为空',

            ]
        );
        if ($validator->fails()){
            $errorMessage = $validator->errors()->first();
            return Result::error($errorMessage);
        }
        $requireData['user_id'] =Context::get("UserId");
        //type==1 同意 type==2 拒绝
        $result = $this->chatServiceClient->updateContactApply($requireData);
        if($requireData['type']==1){

        }
        return $result?Result::success($result['data']):Result::error($result['message']);
    }

    /**
     * 删除好友
     * @return array
     */
    public function delContact()
    {
        $requireData = $this->request->all();
        $validator = $this->validationFactory->make(
            $requireData,
            [
                'friend_id' => 'required',
            ],
            [
                'friend_id.required' => '好友ID不能为空',
            ]
        );
        if ($validator->fails()){
            $errorMessage = $validator->errors()->first();
            return Result::error($errorMessage);
        }
        $requireData['user_id'] =Context::get("UserId");
        $result = $this->chatServiceClient->delContact($requireData);
        return $result?Result::success($result['data']):Result::error($result['message']);
    }

    /**
     * 获取好友列表
     * @return array
     */
    public function getContactList()
    {
        $requireData = $this->request->all();
        $requireData['user_id'] =Context::get("UserId");
        $requireData['keyWord'] = $this->request->input('keyWord','');
        $result = $this->chatServiceClient->getContactList($requireData);
        return $result?Result::success($result['data']):Result::error($result['message']);
    }

    /**
     * 获取会话列表
     * @return array
     */
      public function getTalkSessionList()
      {
          $requireData = $this->request->all();
          $requireData['user_id'] =Context::get("UserId");
          var_dump("会话列表:",$requireData);
          $result = $this->chatServiceClient->getTalkSessionList($requireData);
          var_dump($result);
          if($result['data']['row']){
              foreach ($result['data']['row'] as $k=>$v){
                  $result['data']['row'][$k]['messages'] = [];
              }
          }
          return $result?Result::success($result['data']):Result::error($result['message']);
      }

    /**
     * 创建用户群
     * @return array
     */
      public function addTalkGroup()
      {
          $requireData = $this->request->all();
          $validator = $this->validationFactory->make(
              $requireData,
              [
                  'group_name' => 'required',
                  'user_id_arr' => 'required'
              ],
              [
                  'group_name.required' => '群名称不能为空',
                  'user_id_arr.required' => '好友ID不能为空',
              ]
          );
          if ($validator->fails()){
              $errorMessage = $validator->errors()->first();
              return Result::error($errorMessage);
          }
          $requireData['user_id'] = Context::get("UserId");
          $requireData['user_id_arr'] = $requireData['user_id_arr'];
          var_dump($requireData);
          $result = $this->chatServiceClient->addTalkGroup($requireData);
          return $result['code']==200?Result::success($result['data']):Result::error($result['message']);

      }

    /**
     * 会话详情
     * @return void
     */
      public function getTalkRecordsList()
      {
          $requireData = $this->request->all();
          $validator = $this->validationFactory->make(
              $requireData,
              [
                  'session_id' => 'required',
                  'talk_type' => 'required'
              ],
              [
                  'session_id.required' => '会话ID不能为空',
                  'talk_type.required' => '会话类型不能为空',
              ]
          );
          if ($validator->fails()){
              $errorMessage = $validator->errors()->first();
              return Result::error($errorMessage);
          }
          $requireData['page'] = $requireData['page']??1;
          $requireData['pageSize'] = $requireData['pageSize']??30;
          $result = $this->chatServiceClient->getTalkRecordsList($requireData);
          return $result['code']==200?Result::success($result['data']):Result::error($result['message']);
      }

    /**
     * 添加聊天
     * @return void
     */
      public function addTalkRecords()
      {
          $requireData = $this->request->all();
          $validator = $this->validationFactory->make(
              $requireData,
              [
                  'type' => 'required',
                  'content' => 'required',
                  'receiver'=>'required',

              ],
              [
                  'type.required' => '消息类型不能为空',
                  'content.required' => '内容不能为空',
                  'receiver.required' => '会话信息不能为空',
              ]
          );
          if ($validator->fails()){
              $errorMessage = $validator->errors()->first();
              return Result::error($errorMessage);
          }
          $requireData['user_id'] =Context::get("UserId");
          $result = $this->chatServiceClient->addTalkRecords($requireData);
          return $result['code']==200?Result::success($result['data']):Result::error($result['message']);
      }

    /**
     * 获取openId
     * @return array|void
     */
      public function wechatOpenInfo()
      {
          $requireData = $this->request->all();
          $validator = $this->validationFactory->make(
              $requireData,
              [
                  'code' => 'required',
              ],
              [
                  'code.required' => 'code不能为空',
              ]
          );
          if ($validator->fails()){
              $errorMessage = $validator->errors()->first();
              return Result::error($errorMessage);
          }
          $url = env("WECHAT")."sns/jscode2session?appid=".env("APPID")."&secret=".env("APP_SECRET")."&js_code=".$requireData['code']."&grant_type=authorization_code";
          $result =  PublicData::http_get($url);
          $resultData = json_decode($result,true);
          if (isset($resultData['errcode'])){
             return  Result::error($resultData['errmsg']);
          }
          return Result::success($resultData);
      }

    /**
     * 获取 access_token
     * @return array
     */
      public function getAccessToken()
      {
          $url = env("WECHAT")."cgi-bin/token?appid=".env("APPID")."&secret=".env("APP_SECRET")."&grant_type=client_credential";
          $result =  PublicData::http_get($url);
          $resultData = json_decode($result,true);
          var_dump($url,$resultData);
          if (isset($resultData['errcode'])){
              return  Result::error($resultData['errmsg']);
          }
          return Result::success($resultData);
      }

}