# 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.

from oslo_config import cfg
from oslo_log import log
from oslo_middleware import cors

import ironic_inspector.conf
from ironic_inspector import version


MIN_VERSION_HEADER = 'X-OpenStack-Ironic-Inspector-API-Minimum-Version'
MAX_VERSION_HEADER = 'X-OpenStack-Ironic-Inspector-API-Maximum-Version'
VERSION_HEADER = 'X-OpenStack-Ironic-Inspector-API-Version'


def set_config_defaults():
    """Return a list of oslo.config options available in Inspector code."""
    log.set_defaults(default_log_levels=['sqlalchemy=WARNING',
                                         'iso8601=WARNING',
                                         'requests=WARNING',
                                         'urllib3.connectionpool=WARNING',
                                         'keystonemiddleware=WARNING',
                                         'swiftclient=WARNING',
                                         'keystoneauth=WARNING',
                                         'ironicclient=WARNING'])
    set_cors_middleware_defaults()


def set_cors_middleware_defaults():
    """Update default configuration options for oslo.middleware."""
    # TODO(krotscheck): Update with https://review.openstack.org/#/c/285368/
    cfg.set_defaults(
        cors.CORS_OPTS,
        allow_headers=['X-Auth-Token',
                       MIN_VERSION_HEADER,
                       MAX_VERSION_HEADER,
                       VERSION_HEADER],
        allow_methods=['GET', 'POST', 'PUT', 'HEAD',
                       'PATCH', 'DELETE', 'OPTIONS']
    )


def parse_args(args, default_config_files=None):
    cfg.CONF(args,
             project='ironic-inspector',
             version=version.version_info.release_string(),
             default_config_files=default_config_files)


def list_opts():
    return [
        ('capabilities', ironic_inspector.conf.capabilities.list_opts()),
        ('DEFAULT', ironic_inspector.conf.default.list_opts()),
        ('discovery', ironic_inspector.conf.discovery.list_opts()),
        ('dnsmasq_pxe_filter',
         ironic_inspector.conf.dnsmasq_pxe_filter.list_opts()),
        ('swift', ironic_inspector.conf.swift.list_opts()),
        ('ironic', ironic_inspector.conf.ironic.list_opts()),
        ('iptables', ironic_inspector.conf.iptables.list_opts()),
        ('processing', ironic_inspector.conf.processing.list_opts()),
        ('pci_devices', ironic_inspector.conf.pci_devices.list_opts()),
        ('pxe_filter', ironic_inspector.conf.pxe_filter.list_opts()),
    ]
