/*
 * Licensed to the Apache Software Foundation (ASF) under one or more
 * contributor license agreements.  See the NOTICE file distributed with
 * this work for additional information regarding copyright ownership.
 * The ASF licenses this file to you 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.
 */

package org.apache.jmeter.protocol.http.sampler

import org.apache.jmeter.config.Arguments
import org.apache.jmeter.config.KeystoreConfig
import org.apache.jmeter.protocol.http.control.AuthManager
import org.apache.jmeter.protocol.http.control.CacheManager
import org.apache.jmeter.protocol.http.control.CookieManager
import org.apache.jmeter.protocol.http.control.DNSCacheManager
import org.apache.jmeter.protocol.http.control.HeaderManager
import org.apache.jmeter.protocol.http.util.HTTPConstants
import org.apache.jmeter.protocol.http.util.HTTPFileArgs
import org.apache.jmeter.testelement.TestElementSchema
import org.apache.jmeter.testelement.schema.BooleanPropertyDescriptor
import org.apache.jmeter.testelement.schema.IntegerPropertyDescriptor
import org.apache.jmeter.testelement.schema.StringPropertyDescriptor
import org.apache.jmeter.testelement.schema.TestElementPropertyDescriptor
import org.apiguardian.api.API
import java.nio.charset.StandardCharsets

/**
 * Lists properties of a [HTTPSamplerBase].
 * @see HTTPSamplerBase
 * @since 5.6
 */
@API(status = API.Status.EXPERIMENTAL, since = "5.6")
public abstract class HTTPSamplerBaseSchema : TestElementSchema() {
    public companion object INSTANCE : HTTPSamplerBaseSchema()

    public val arguments: TestElementPropertyDescriptor<HTTPSamplerBaseSchema, Arguments>
        by testElement("HTTPsampler.Arguments")

    public val authManager: TestElementPropertyDescriptor<HTTPSamplerBaseSchema, AuthManager>
        by testElement("HTTPSampler.auth_manager")

    public val cookieManager: TestElementPropertyDescriptor<HTTPSamplerBaseSchema, CookieManager>
        by testElement("HTTPSampler.cookie_manager")

    public val keystoreConfig: TestElementPropertyDescriptor<HTTPSamplerBaseSchema, KeystoreConfig>
        by testElement("HTTPSampler.keystore_configuration")

    public val cacheManager: TestElementPropertyDescriptor<HTTPSamplerBaseSchema, CacheManager>
        by testElement("HTTPSampler.cache_manager")

    public val headerManager: TestElementPropertyDescriptor<HTTPSamplerBaseSchema, HeaderManager>
        by testElement("HTTPSampler.header_manager")

    public val dnsCacheManager: TestElementPropertyDescriptor<HTTPSamplerBaseSchema, DNSCacheManager>
        by testElement("HTTPSampler.dns_cache_manager")

    public val method: StringPropertyDescriptor<HTTPSamplerBaseSchema>
        by string("HTTPSampler.method", default = HTTPSamplerBase.DEFAULT_METHOD)

    public val protocol: StringPropertyDescriptor<HTTPSamplerBaseSchema>
        by string("HTTPSampler.protocol", default = HTTPConstants.PROTOCOL_HTTP)

    public val domain: StringPropertyDescriptor<HTTPSamplerBaseSchema>
        by string("HTTPSampler.domain")

    public val port: IntegerPropertyDescriptor<HTTPSamplerBaseSchema>
        by int("HTTPSampler.port")

    public val path: StringPropertyDescriptor<HTTPSamplerBaseSchema>
        by string("HTTPSampler.path")

    public val proxy: HTTPSamplerProxyParamsSchema<HTTPSamplerBaseSchema> by HTTPSamplerProxyParamsSchema()

    public val contentEncoding: StringPropertyDescriptor<HTTPSamplerBaseSchema>
        by string("HTTPSampler.contentEncoding", default = StandardCharsets.UTF_8.name())

    public val implementation: StringPropertyDescriptor<HTTPSamplerBaseSchema>
        by string("HTTPSampler.implementation")

    public val connectTimeout: IntegerPropertyDescriptor<HTTPSamplerBaseSchema>
        by int("HTTPSampler.connect_timeout")

    public val responseTimeout: IntegerPropertyDescriptor<HTTPSamplerBaseSchema>
        by int("HTTPSampler.response_timeout")

    public val followRedirects: BooleanPropertyDescriptor<HTTPSamplerBaseSchema>
        by boolean("HTTPSampler.follow_redirects")

    public val autoRedirects: BooleanPropertyDescriptor<HTTPSamplerBaseSchema>
        by boolean("HTTPSampler.auto_redirects")

    public val useKeepalive: BooleanPropertyDescriptor<HTTPSamplerBaseSchema>
        by boolean("HTTPSampler.use_keepalive")

    public val useMultipartPost: BooleanPropertyDescriptor<HTTPSamplerBaseSchema>
        by boolean("HTTPSampler.DO_MULTIPART_POST")

    public val useBrowserCompatibleMultipart: BooleanPropertyDescriptor<HTTPSamplerBaseSchema>
        by boolean("HTTPSampler.BROWSER_COMPATIBLE_MULTIPART", default = false)

    public val concurrentDownload: BooleanPropertyDescriptor<HTTPSamplerBaseSchema>
        by boolean("HTTPSampler.concurrentDwn", default = false)

    public val concurrentDownloadPoolSize: IntegerPropertyDescriptor<HTTPSamplerBaseSchema>
        by int("HTTPSampler.concurrentPool", default = 6)

    public val retrieveEmbeddedResources: BooleanPropertyDescriptor<HTTPSamplerBaseSchema>
        by boolean("HTTPSampler.image_parser", default = false)

    public val embeddedUrlAllowRegex: StringPropertyDescriptor<HTTPSamplerBaseSchema>
        by string("HTTPSampler.embedded_url_re")

    public val embeddedUrlExcludeRegex: StringPropertyDescriptor<HTTPSamplerBaseSchema>
        by string("HTTPSampler.embedded_url_exclude_re")

    public val storeAsMD5: BooleanPropertyDescriptor<HTTPSamplerBaseSchema>
        by boolean("HTTPSampler.md5", default = false)

    public val postBodyRaw: BooleanPropertyDescriptor<HTTPSamplerBaseSchema>
        by boolean("HTTPSampler.postBodyRaw", default = false)

    public val ipSource: StringPropertyDescriptor<HTTPSamplerBaseSchema>
        by string("HTTPSampler.ipSource")

    public val ipSourceType: IntegerPropertyDescriptor<HTTPSamplerBaseSchema>
        by int("HTTPSampler.ipSourceType", default = HTTPSamplerBase.SourceType.HOSTNAME.ordinal)

    public val fileArguments: TestElementPropertyDescriptor<HTTPSamplerBaseSchema, HTTPFileArgs>
        by testElement("HTTPsampler.Files")
}
