<?php

if (!function_exists('json')) {
    /**
     * 返回统一接口响应
     *
     * @param bool   $status
     * @param int    $code      状态码
     * @param string $message   提示消息
     * @param null   $data      数据
     * @param array  $extension 扩展数据
     *
     * @return JsonResponse
     */
    function json(bool $status, int $code = 200, string $message = '', $data = null, array $extension = []): JsonResponse
    {
        $request = request();

        $response = [
            'status' => $status,
            'code' => $code,
            'message' => $message,
            'data' => new ArrayObject(),
        ];

        if ($data) {
            $response['data'] = $data;

            // 普通 Eloquent Collection 对象
            if ($data instanceof Illuminate\Database\Eloquent\Collection) {
                $response['data'] = $data->toArray();
            }

            // 单条数据的结构
            if ($data instanceof JsonResource) {
                $response['data'] = $data;
            }

            // 列表数据的结构
            if ($data instanceof AnonymousResourceCollection) {
                // links 附带查询条件
                $meta = json_decode($data->withQuery($request->query())->toResponse($request)->content(), true);
                $meta['meta']['links'] = $meta['links'];
                $response['data'] = [
                    'items' => $data,
                    'pagination' => [
                        'currentPage' => $meta['meta']['current_page'],
                        'perPage' => $meta['meta']['per_page'],
                        'total' => $meta['meta']['total'],
                    ],
                    'extensions' => $extension ?: new ArrayObject(),
                ];
            }

            // 查询构造器分页
            if ($data instanceof LengthAwarePaginator) {
                $response['data'] = [
                    'items' => $data->getCollection(),
                    'pagination' => [
                        'perPage' => $data->perPage(),
                        'currentPage' => $data->currentPage(),
                        'total' => $data->total(),
                    ],
                    'extensions' => $extension ?: new ArrayObject(),
                ];
            }
        }

        return response()->json($response, $code);
    }
}


if (!function_exists('success')) {
    /**
     * 返回成功响应
     *
     * @param null   $data
     * @param int    $code
     * @param string $message
     * @param array  $extension
     *
     * @return JsonResponse
     */
    function success($data = null, int $code = 200, string $message = '', array $extension = []): JsonResponse
    {
        if (!$message) {
            $message = __('操作成功');
        }

        return json(true, $code, $message, $data, $extension);
    }
}

if (!function_exists('error')) {
    /**
     * 返回失败响应
     *
     * @param string $message
     * @param int    $code
     *
     * @return JsonResponse
     */
    function error(string $message = '', int $code = 500): JsonResponse
    {
        if (!$message) {
            $message = __('操作失败');
        }

        return json(false, $code, $message);
    }
}

if (!function_exists('format')) {
    /**
     * 格式化时间
     *
     * @param $datetime null|string|\Illuminate\Support\Carbon 需要被格式化的时间
     *
     * @return mixed|string
     */
    function format($datetime): string
    {
        if ($datetime instanceof \Illuminate\Support\Carbon) {
            return $datetime->format('Y-m-d H:i:s');
        }

        if (is_null($datetime)) {
            return '';
        }

        return $datetime;
    }
}

if (!function_exists('get_route_name')) {
    /**
     * 获取当前路由的名称
     *
     * @param bool $last 是否获取最后一部分
     *
     * @return string
     */
    function get_route_name(bool $last = false): string
    {
        $name = request()->route()->getName();

        if ($last) {
            $array = explode('.', $name);

            return array_pop($array);
        }

        return $name;
    }
}