# Copyright 2014
# The Cloudscaling Group, Inc.
#
# 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 keystoneclient.v2_0 import client as keystone_client_v2
from keystoneclient.v3 import client as keystone_client_v3

from cloudpulseclient.common import httpclient
from cloudpulseclient.v1 import cloudpulseservices as healthcheck


class Client(object):

    def __init__(self, username=None, api_key=None, project_id=None,
                 project_name=None, auth_url=None, cloudpulse_url=None,
                 endpoint_type='publicURL', service_type='container',
                 project_domain_name=None, user_domain_name=None,
                 region_name=None, input_auth_token=None, insecure=False,
                 cacert=None):

        keystone = None
        if not input_auth_token:
            keystone = self.get_keystone_client(
                username=username,
                api_key=api_key,
                auth_url=auth_url,
                project_id=project_id,
                project_name=project_name,
                project_domain_name=project_domain_name,
                user_domain_name=user_domain_name,
                insecure=insecure,
                cacert=cacert)

            input_auth_token = keystone.auth_token
        if not input_auth_token:
            raise RuntimeError("Not Authorized")

        if not cloudpulse_url:
            keystone = keystone or self.get_keystone_client(
                username=username,
                api_key=api_key,
                auth_url=auth_url,
                insecure=insecure,
                cacert=cacert,
                token=input_auth_token,
                project_id=project_id,
                project_name=project_name)
            cloudpulse_url = keystone.service_catalog.url_for(
                service_type=service_type,
                endpoint_type=endpoint_type,
                region_name=region_name)

        http_cli_kwargs = {
            'token': input_auth_token,
            'insecure': insecure,
            'ca_file': cacert,
            # TODO(yuanying): - use insecure
            # 'insecure': kwargs.get('insecure'),
            # TODO(yuanying): - use timeout
            # 'timeout': kwargs.get('timeout'),
            # TODO(yuanying): - use ca_file
            # 'ca_file': kwargs.get('ca_file'),
            # TODO(yuanying): - use cert_file
            # 'cert_file': kwargs.get('cert_file'),
            # TODO(yuanying): - use key_file
            # 'key_file': kwargs.get('key_file'),
            'auth_ref': None,
        }
        self.http_client = httpclient.HTTPClient(cloudpulse_url,
                                                 **http_cli_kwargs)
        self.healthcheck = healthcheck.HealthCheckManager(self.http_client)

    @staticmethod
    def get_keystone_client(username=None, api_key=None, auth_url=None,
                            insecure=False, cacert=None, token=None,
                            project_domain_name=None, user_domain_name=None,
                            project_id=None, project_name=None):
        if not auth_url:
            raise RuntimeError("No auth url specified")
        imported_client = (keystone_client_v2 if "v2.0" in auth_url
                           else keystone_client_v3)

        client = imported_client.Client(
            username=username,
            password=api_key,
            token=token,
            insecure=insecure,
            cacert=cacert,
            tenant_id=project_id,
            tenant_name=project_name,
            project_domain_name=project_domain_name,
            user_domain_name=user_domain_name,
            auth_url=auth_url,
            endpoint=auth_url)
        client.authenticate()

        return client