/*
 * Copyright (c) 2021-2024 Huawei Device Co., Ltd.
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

#ifndef COMMUNICATIONNETSTACK_CONSTANT_H
#define COMMUNICATIONNETSTACK_CONSTANT_H

#include <cstddef>
#include <cstdint>

#include "curl/curl.h"

namespace OHOS::NetStack::Http {
enum class ResponseCode {
    OK = 200,
    CREATED,
    ACCEPTED,
    NOT_AUTHORITATIVE,
    NO_CONTENT,
    RESET,
    PARTIAL,
    MULT_CHOICE = 300,
    MOVED_PERM,
    MOVED_TEMP,
    SEE_OTHER,
    NOT_MODIFIED,
    USE_PROXY,
    BAD_REQUEST = 400,
    UNAUTHORIZED,
    PAYMENT_REQUIRED,
    FORBIDDEN,
    NOT_FOUND,
    BAD_METHOD,
    NOT_ACCEPTABLE,
    PROXY_AUTH,
    CLIENT_TIMEOUT,
    CONFLICT,
    GONE,
    LENGTH_REQUIRED,
    PRECON_FAILED,
    ENTITY_TOO_LARGE,
    REQ_TOO_LONG,
    UNSUPPORTED_TYPE,
    RANGE_NOT_SATISFIABLE,
    INTERNAL_ERROR = 500,
    NOT_IMPLEMENTED,
    BAD_GATEWAY,
    UNAVAILABLE,
    GATEWAY_TIMEOUT,
    VERSION,
};

enum HttpErrorCode {
    HTTP_ERROR_CODE_BASE = 2300000,
    HTTP_UNSUPPORTED_PROTOCOL = HTTP_ERROR_CODE_BASE + CURLE_UNSUPPORTED_PROTOCOL,
    HTTP_URL_MALFORMAT = HTTP_ERROR_CODE_BASE + CURLE_URL_MALFORMAT,
    HTTP_COULDNT_RESOLVE_PROXY = HTTP_ERROR_CODE_BASE + CURLE_COULDNT_RESOLVE_PROXY,
    HTTP_COULDNT_RESOLVE_HOST = HTTP_ERROR_CODE_BASE + CURLE_COULDNT_RESOLVE_HOST,
    HTTP_COULDNT_CONNECT = HTTP_ERROR_CODE_BASE + CURLE_COULDNT_CONNECT,
    HTTP_WEIRD_SERVER_REPLY = HTTP_ERROR_CODE_BASE + CURLE_WEIRD_SERVER_REPLY,
    HTTP_REMOTE_ACCESS_DENIED = HTTP_ERROR_CODE_BASE + CURLE_REMOTE_ACCESS_DENIED,
    HTTP_HTTP2_ERROR = HTTP_ERROR_CODE_BASE + CURLE_HTTP2,
    HTTP_PARTIAL_FILE = HTTP_ERROR_CODE_BASE + CURLE_PARTIAL_FILE,
    HTTP_WRITE_ERROR = HTTP_ERROR_CODE_BASE + CURLE_WRITE_ERROR,
    HTTP_UPLOAD_FAILED = HTTP_ERROR_CODE_BASE + CURLE_UPLOAD_FAILED,
    HTTP_READ_ERROR = HTTP_ERROR_CODE_BASE + CURLE_READ_ERROR,
    HTTP_OUT_OF_MEMORY = HTTP_ERROR_CODE_BASE + CURLE_OUT_OF_MEMORY,
    HTTP_OPERATION_TIMEDOUT = HTTP_ERROR_CODE_BASE + CURLE_OPERATION_TIMEDOUT,
    HTTP_TOO_MANY_REDIRECTS = HTTP_ERROR_CODE_BASE + CURLE_TOO_MANY_REDIRECTS,
    HTTP_GOT_NOTHING = HTTP_ERROR_CODE_BASE + CURLE_GOT_NOTHING,
    HTTP_SEND_ERROR = HTTP_ERROR_CODE_BASE + CURLE_SEND_ERROR,
    HTTP_RECV_ERROR = HTTP_ERROR_CODE_BASE + CURLE_RECV_ERROR,
    HTTP_SSL_CERTPROBLEM = HTTP_ERROR_CODE_BASE + CURLE_SSL_CERTPROBLEM,
    HTTP_SSL_CIPHER = HTTP_ERROR_CODE_BASE + CURLE_SSL_CIPHER,
    HTTP_PEER_FAILED_VERIFICATION = HTTP_ERROR_CODE_BASE + CURLE_PEER_FAILED_VERIFICATION,
    HTTP_BAD_CONTENT_ENCODING = HTTP_ERROR_CODE_BASE + CURLE_BAD_CONTENT_ENCODING,
    HTTP_FILESIZE_EXCEEDED = HTTP_ERROR_CODE_BASE + CURLE_FILESIZE_EXCEEDED,
    HTTP_REMOTE_DISK_FULL = HTTP_ERROR_CODE_BASE + CURLE_REMOTE_DISK_FULL,
    HTTP_REMOTE_FILE_EXISTS = HTTP_ERROR_CODE_BASE + CURLE_REMOTE_FILE_EXISTS,
    HTTP_SSL_CACERT_BADFILE = HTTP_ERROR_CODE_BASE + CURLE_SSL_CACERT_BADFILE,
    HTTP_REMOTE_FILE_NOT_FOUND = HTTP_ERROR_CODE_BASE + CURLE_REMOTE_FILE_NOT_FOUND,
    HTTP_AUTH_ERROR = HTTP_ERROR_CODE_BASE + CURLE_AUTH_ERROR,
    HTTP_SSL_PINNEDPUBKEYNOTMATCH = HTTP_ERROR_CODE_BASE + CURLE_SSL_PINNEDPUBKEYNOTMATCH,
    HTTP_NOT_ALLOWED_HOST = 2300998,
    HTTP_UNKNOWN_OTHER_ERROR = 2300999
};

enum class HttpDataType {
    /**
     * The returned type is string.
     */
    STRING,
    /**
     * The returned type is Object.
     */
    OBJECT = 1,
    /**
     * The returned type is ArrayBuffer.
     */
    ARRAY_BUFFER = 2,
    /**
     * The returned type is not set.
     */
    NO_DATA_TYPE = 3,
};

class HttpConstant final {
public:
    /* Http Method */
    static const char *const HTTP_METHOD_GET;
    static const char *const HTTP_METHOD_HEAD;
    static const char *const HTTP_METHOD_OPTIONS;
    static const char *const HTTP_METHOD_TRACE;
    static const char *const HTTP_METHOD_DELETE;
    static const char *const HTTP_METHOD_POST;
    static const char *const HTTP_METHOD_PUT;
    static const char *const HTTP_METHOD_CONNECT;

    /* default options */
    static const uint32_t DEFAULT_MAX_LIMIT;
    static const uint32_t MAX_LIMIT;
    static const uint32_t DEFAULT_READ_TIMEOUT;
    static const uint32_t DEFAULT_CONNECT_TIMEOUT;

    static const size_t MAX_JSON_PARSE_SIZE;

    /* options key */
    static const char *const PARAM_KEY_METHOD;
    static const char *const PARAM_KEY_EXTRA_DATA;
    static const char *const PARAM_KEY_HEADER;
    static const char *const PARAM_KEY_MAX_LIMIT;
    static const char *const PARAM_KEY_READ_TIMEOUT;
    static const char *const PARAM_KEY_DNS_SERVERS;
    static const char *const PARAM_KEY_RESUME_FROM;
    static const char *const PARAM_KEY_RESUME_TO;
    static const char *const PARAM_KEY_CONNECT_TIMEOUT;
    static const char *const PARAM_KEY_USING_PROTOCOL;
    static const char *const PARAM_KEY_USING_CACHE;
    static const char *const PARAM_KEY_EXPECT_DATA_TYPE;
    static const char *const PARAM_KEY_PRIORITY;
    static const char *const PARAM_KEY_CA_PATH;
    static const char *const PARAM_KEY_DOH_URL;

    static const char *const PARAM_KEY_USING_HTTP_PROXY;
    static const char *const PARAM_KEY_CLIENT_CERT;
    static const char *const PARAM_KEY_MULTI_FORM_DATA_LIST;
    static const char *const PARAM_KEY_CERTIFICATE_PINNING;

    static const char *const HTTP_PROXY_KEY_HOST;
    static const char *const HTTP_PROXY_KEY_PORT;
    static const char *const HTTP_PROXY_KEY_EXCLUSION_LIST;
    static const char *const HTTP_PROXY_EXCLUSIONS_SEPARATOR;

    static const char *const HTTP_CLIENT_CERT;
    static const char *const HTTP_CLIENT_CERT_TYPE;
    static const char *const HTTP_CLIENT_KEY;
    static const char *const HTTP_CLIENT_KEY_PASSWD;

    static const char *const HTTP_HASH_ALGORITHM;
    static const char *const HTTP_PUBLIC_KEY_HASH;

    static const char *const HTTP_CERT_TYPE_PEM;
    static const char *const HTTP_CERT_TYPE_DER;
    static const char *const HTTP_CERT_TYPE_P12;

    static const char *const HTTP_MULTI_FORM_DATA_NAME;
    static const char *const HTTP_MULTI_FORM_DATA_CONTENT_TYPE;
    static const char *const HTTP_MULTI_FORM_DATA_REMOTE_FILE_NAME;
    static const char *const HTTP_MULTI_FORM_DATA_DATA;
    static const char *const HTTP_MULTI_FORM_DATA_FILE_PATH;

    static const char *const RESPONSE_KEY_RESULT;
    static const char *const RESPONSE_KEY_RESPONSE_CODE;
    static const char *const RESPONSE_KEY_HEADER;
    static const char *const RESPONSE_KEY_COOKIES;
    static const char *const RESPONSE_KEY_RESULT_TYPE;
    static const char *const RESPONSE_KEY_SET_COOKIE;
    static const char *const RESPONSE_KEY_SET_COOKIE_SEPARATOR;

    static const char *const RESPONSE_PERFORMANCE_TIMING;
    static const char *const RESPONSE_DNS_TIMING;
    static const char *const RESPONSE_TCP_TIMING;
    static const char *const RESPONSE_TLS_TIMING;
    static const char *const RESPONSE_FIRST_SEND_TIMING;
    static const char *const RESPONSE_FIRST_RECEIVE_TIMING;
    static const char *const RESPONSE_TOTAL_FINISH_TIMING;
    static const char *const RESPONSE_REDIRECT_TIMING;
    static const char *const RESPONSE_HEADER_TIMING;
    static const char *const RESPONSE_BODY_TIMING;
    static const char *const RESPONSE_TOTAL_TIMING;

    static const char *const HTTP_URL_PARAM_START;
    static const char *const HTTP_URL_PARAM_SEPARATOR;
    static const char *const HTTP_URL_NAME_VALUE_SEPARATOR;
    static const char *const HTTP_HEADER_SEPARATOR;
    static const char *const HTTP_HEADER_BLANK_SEPARATOR;
    static const char *const HTTP_LINE_SEPARATOR;
    static const char *const HTTP_RESPONSE_HEADER_SEPARATOR;

    static const char *const HTTP_DEFAULT_USER_AGENT;
    static const char *const HTTP_PREPARE_CA_PATH;

    static const char *const HTTP_CONTENT_TYPE;
    static const char *const HTTP_CONTENT_TYPE_URL_ENCODE;
    static const char *const HTTP_CONTENT_TYPE_JSON;
    static const char *const HTTP_CONTENT_TYPE_OCTET_STREAM;
    static const char *const HTTP_CONTENT_TYPE_IMAGE;
    static const char *const HTTP_CONTENT_TYPE_MULTIPART;

    static const char *const HTTP_CONTENT_ENCODING_GZIP;

    static const char *const REQUEST_TIME;
    static const char *const RESPONSE_TIME;
};
} // namespace OHOS::NetStack::Http

#endif /* COMMUNICATIONNETSTACK_CONSTANT_H */