local typedefs = require "kong.db.schema.typedefs"

return {
    name = "rate-limit",
    fields = {
        {consumer = typedefs.no_consumer},
        {protocols = typedefs.protocols_http}, {
            config = {
                type = "record",
                fields = {
                    {second = {type = "number", gt = 0}},
                    {minute = {type = "number", gt = 0}},
                    {hour = {type = "number", gt = 0}},
                    {day = {type = "number", gt = 0}},
                    {month = {type = "number", gt = 0}},
                    {year = {type = "number", gt = 0}},
                    {header_name = typedefs.header_name({required = false})},
                    {
                        fault_tolerant = {
                            type = "boolean",
                            required = true,
                            default = true
                        }
                    }, {redis_host = typedefs.host({required = true})},
                    {redis_port = typedefs.port({default = 6379})},
                    {redis_password = {type = "string", len_min = 0}},
                    {redis_username = {type = "string"}},
                    {
                        redis_ssl = {
                            type = "boolean",
                            required = true,
                            default = false
                        }
                    },
                    {
                        redis_ssl_verify = {
                            type = "boolean",
                            required = true,
                            default = false
                        }
                    },
                    {
                        redis_timeout = {
                            type = "number",
                            required = true,
                            default = 2000
                        }
                    }, {redis_database = {type = "integer", default = 0}}, {
                        error_format = {
                            type = "string",
                            default = "openapi",
                            one_of = {"dataapi", "openapi", "inner"}
                        }
                    },
                    {
                        hide_client_headers = {
                            type = "boolean",
                            required = false,
                            default = false
                        }
                    },
                    {
                        use_dynamic_error_message = {
                            type = "boolean",
                            required = false,
                            default = false
                        }
                    }
                },
                custom_validator = function(config)
                    if not (config.second or config.minute or config.hour or
                            config.day or config.month or config.year) then
                        return nil, "at least one of these fields must be set: 'second', 'minute', 'hour', 'day', 'month', 'year'"
                    end
                    return true
                end
            }
        }
    }
}
