<?php

declare(strict_types=1);

namespace App\Exception\Handler;

use App\Constants\ErrorCode;
use App\Helper\Result;
use Hyperf\Context\Context;
use Hyperf\ExceptionHandler\ExceptionHandler;
use Hyperf\Validation\ValidationException;
use Hyperf\HttpMessage\Stream\SwooleStream;
use Hyperf\JsonRpc\DataFormatter;
use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\ServerRequestInterface;
use Throwable;

class ValidateExceptionHandler extends ExceptionHandler
{
    public function handle(Throwable $throwable, ResponseInterface $response)
    {
        $this->stopPropagation();
        $babMessages = $throwable->validator->errors();
        $message = $babMessages->first();
        $error = explode('|', $message, 2);
        $code = $error[1] ?? ErrorCode::COMMON_ERROR;
        $data = Result::error($code, $error[0]);

        $dataFormatter = make(DataFormatter::class);
        $request = Context::get(ServerRequestInterface::class);
        $id = $request->getAttribute('request_id');
        $result = $dataFormatter->formatResponse([$id, $data]);
        $responseStr = json_encode($result, JSON_UNESCAPED_UNICODE);

        return $response->withHeader('Content-Type', 'application/json')->withBody(new SwooleStream($responseStr));
    }

    /**
     * 判断该异常处理器是否要对该异常进行处理
     */
    public function isValid(Throwable $throwable): bool
    {
        return $throwable instanceof ValidationException;
    }
}