<?php
namespace App\Tools;
use App\Constants\ErrorCode;
class Result
{
    public static function success($data = [])
    {
        return static::result(ErrorCode::SUCCESS, ErrorCode::getMessage(ErrorCode::SUCCESS), $data);
    }
    public static function error($message = '', $code = ErrorCode::ERROR, $data = [])
    {
        if (empty($message)) {
            return static::result($code, ErrorCode::getMessage($code), $data);
        } else {
            return static::result($code, $message, $data);
        }
    }
    protected static function result($code, $message, $data)
    {
        return [
            'code' => $code,
            'message' => $message,
            'data' => $data,
        ];
    }

    //判断连接是否正确
    public static function pageExists($url) {
        $ch = curl_init();

        // 设置 cURL 选项
        curl_setopt($ch, CURLOPT_URL, $url);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); // 返回响应作为字符串，而不是直接输出
        curl_setopt($ch, CURLOPT_NOBODY, false); // 如果你想检查内容，设置为 false
        curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); // 允许重定向
        curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 100); // 设置连接超时时间
        curl_setopt($ch, CURLOPT_TIMEOUT, 200); // 设置读取数据的超时时间
        curl_setopt($ch, CURLOPT_FAILONERROR, true); // 在发生错误时返回 FALSE
        curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36'); // 设置用户代理，模拟浏览器请求

        // 执行 cURL 请求
        $response = curl_exec($ch);

        // 检查是否有 cURL 错误发生
        if (curl_errno($ch)) {
            curl_close($ch);
            return false;
        }

        // 获取 HTTP 状态码
        $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);

        // 关闭 cURL
        curl_close($ch);

        // 判断 HTTP 状态码是否在 200-299 范围内（表示成功）
        // 或者你可以根据需要调整这个范围，比如包括 301, 302 重定向等
        return $httpCode;
    }

    public static function http_get($url)
    {
        $oCurl = curl_init();
        if (stripos($url, "https://") !== false) {
            curl_setopt($oCurl, CURLOPT_SSL_VERIFYPEER, false);
            curl_setopt($oCurl, CURLOPT_SSL_VERIFYHOST, false);
            curl_setopt($oCurl, CURLOPT_SSLVERSION, 1); //CURL_SSLVERSION_TLSv1
        }
        curl_setopt($oCurl, CURLOPT_URL, $url);
        curl_setopt($oCurl, CURLOPT_RETURNTRANSFER, 1);
        $sContent = curl_exec($oCurl);
        $aStatus = curl_getinfo($oCurl);
        curl_close($oCurl);
        if (intval($aStatus["http_code"]) == 200) {
            return $sContent;
        } else {
            return false;
        }
    }

    /**
     * POST 请求
     * @param string $url
     * @param array $param
     * @param boolean $post_file 是否文件上传
     * @return string content
     */
    public static function http_post($url, $data, $options = [])
    {

        // 初始化CURL会话
        $ch = curl_init($url);

        // 设置CURL选项
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); // 将curl_exec()获取的信息以文件流的形式返回，而不是直接输出。
        curl_setopt($ch, CURLOPT_HEADER, false); // 将curl_exec()获取的信息以文件流的形式返回，而不是直接输出。
        curl_setopt($ch, CURLOPT_POST, true); // 发送一个常规的POST请求。
        curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($data)); // 要传递的POST数据，这里使用http_build_query将数组转换为URL编码的查询字符串。

        // 如果有额外的CURL选项，则合并它们
        if (!empty($options)) {
            curl_setopt_array($ch, $options);
        }

        // 执行CURL会话并获取响应
        $response = curl_exec($ch);
        // 检查是否有CURL错误
        if (curl_errno($ch)) {
            $error_msg = curl_error($ch);
            curl_close($ch);
            throw new Exception("CURL Error: $error_msg");
        }

        // 获取HTTP状态码
        $http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE);

        // 关闭CURL会话
        curl_close($ch);

        // 返回一个包含响应和HTTP状态码的数组
        $responseBody = $response;
        $headerEnd = strpos($response, "\r\n\r\n");

        if ($headerEnd !== false) {
            // 去除响应头，只保留响应体
            $responseBody = substr($response, $headerEnd + 4); // +4 是因为 "\r\n\r\n" 有4个字符
//            echo $responseBody; // 输出：This is the response body.
        } else {
            // 如果没有找到空行，可能响应格式不正确或没有响应头
//            echo "No headers found in response.";
        }
        return [
            'response' => $responseBody,
            'http_code' => $http_code
        ];
    }
}