<?php
/**
 * 响应体封装
 *
 *  @author wujunzhong <1250044515@qq.com>
 * @date 2018/1/12
 */

namespace App\Traits;

use Response;
use Symfony\Component\HttpFoundation\Response as FoundationResponse;

trait ApiResponse
{
    /**
     * @var int HTTP code
     */
    protected $statusCode = FoundationResponse::HTTP_OK;

    /**
     * get the HTTP code
     * @return mixed
     */
    private function getStatusCode()
    {
        return $this->statusCode;
    }

    /**
     * set the HTTP code
     *
     * @param $statusCode
     * @return $this
     */
    private function setStatusCode($statusCode)
    {
        $this->statusCode = $statusCode;
        return $this;
    }

    /**
     *  Repond a no content response.
     *
     * @param $data
     * @param array $header
     * @return mixed
     */
    public function respond($data, $header = [])
    {
        return Response::json($data, $this->getStatusCode(), $header);
    }

    /**
     * Repond a no content response.
     *
     * @return response
     */
    public function noContent()
    {
        return Response::json(null, FoundationResponse::HTTP_NO_CONTENT);
    }

    /**
     * Repond a Request format error!
     *
     * @param $message
     * @param int $code
     * @return mixed
     */
    public function failed($message = 'Request format error!', $code = FoundationResponse::HTTP_BAD_REQUEST)
    {
        return $this->setStatusCode($code)->respond(['message' => $message]);
    }

    /**
     * Repond a not found!
     *
     * @param string $message
     * @return mixed
     */
    public function notFond($message = 'not found!')
    {
        return $this->failed($message, Foundationresponse::HTTP_NOT_FOUND);
    }

    /**
     * Repond a validation error!
     *
     * @param string $message
     * @return mixed
     */
    public function formError($error = [])
    {
        return $this->setStatusCode(422)->respond(['message' => "The given data was invalid.", 'error' => $error]);
    }

    /**
     * Repond a Interface requests are too frequent!
     *
     * @param string $message
     * @return mixed
     */
    public function requestsMany($message = 'Interface requests are too frequent!')
    {
        return $this->failed($message, 429);
    }

    /**
     * Respond the error of 'Unauthorized'.
     *
     * @param  string $message
     * @return json
     */
    public function errorUnauthorized($message = 'Unauthorized')
    {
        return $this->failed($message, 401);
    }

    /**
     * Respond No access
     *
     * @param string $message
     * @return mixed
     */
    public function notAccess($message = 'No access!')
    {
        return $this->failed($message, 403);
    }

    /**
     * resond a network error!
     *
     * @param string $message
     * @return mixed
     */
    public function internalError($message = "network error!")
    {
        return $this->failed($message, FoundationResponse::HTTP_INTERNAL_SERVER_ERROR);
    }

    /**
     * @param $data
     * @param int $code
     * @param array $header
     * @return mixed
     */
    public function success($data, $code = FoundationResponse::HTTP_CREATED, $header = [])
    {
        $data = is_string($data) ? ['message' => $data] : $data;
        return $this->setStatusCode($code)->respond($data, $header);
    }
}