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

from typing import Dict

from libcloud.backup.providers import Provider as BackupProvider
from libcloud.backup.providers import get_driver as get_backup_driver

from libcloud.compute.providers import Provider as ComputeProvider
from libcloud.compute.providers import get_driver as get_compute_driver

from libcloud.container.providers import Provider as ContainerProvider
from libcloud.container.providers import get_driver as get_container_driver

from libcloud.dns.providers import Provider as DnsProvider
from libcloud.dns.providers import get_driver as get_dns_driver

from libcloud.loadbalancer.providers import Provider as LoadBalancerProvider
from libcloud.loadbalancer.providers import get_driver as get_loadbalancer_driver

from libcloud.storage.providers import Provider as StorageProvider
from libcloud.storage.providers import get_driver as get_storage_driver


class DriverType(object):
    """Backup-as-a-service driver"""

    BACKUP = BackupProvider

    """ Compute-as-a-Service driver """
    COMPUTE = ComputeProvider

    """ Container-as-a-Service driver """
    CONTAINER = ContainerProvider

    """ DNS service provider driver """
    DNS = DnsProvider

    """ Load balancer provider-driver """
    LOADBALANCER = LoadBalancerProvider

    """ Storage-as-a-Service driver """
    STORAGE = StorageProvider


DriverTypeFactoryMap = {
    DriverType.BACKUP: get_backup_driver,
    DriverType.COMPUTE: get_compute_driver,
    DriverType.CONTAINER: get_container_driver,
    DriverType.DNS: get_dns_driver,
    DriverType.LOADBALANCER: get_loadbalancer_driver,
    DriverType.STORAGE: get_storage_driver,
}  # type: Dict


class DriverTypeNotFoundError(KeyError):
    def __init__(self, type):
        self.message = "Driver type '%s' not found." % type

    def __repr__(self):
        return self.message


def get_driver(type, provider):
    """
    Get a driver
    """
    try:
        return DriverTypeFactoryMap[type](provider)
    except KeyError:
        raise DriverTypeNotFoundError(type)
