#    Copyright 2017 Mirantis, 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


import kubernetes
from kubernetes import client

from tcp_tests.managers.k8s.componentstatuses import \
    K8sComponentStatusManager
from tcp_tests.managers.k8s.daemonsets import K8sDaemonSetManager
from tcp_tests.managers.k8s.deployments import K8sDeploymentManager
from tcp_tests.managers.k8s.endpoints import K8sEndpointsManager
from tcp_tests.managers.k8s.events import K8sEventManager
from tcp_tests.managers.k8s.horizontalpodautoscalers import \
    K8sHorizontalPodAutoscalerManager
from tcp_tests.managers.k8s.ingresses import K8sIngressManager
from tcp_tests.managers.k8s.jobs import K8sJobManager
from tcp_tests.managers.k8s.limitranges import K8sLimitRangeManager
from tcp_tests.managers.k8s.namespaces import K8sNamespaceManager
from tcp_tests.managers.k8s.nodes import K8sNodeManager
from tcp_tests.managers.k8s.persistentvolumeclaims import \
    K8sPersistentVolumeClaimManager
from tcp_tests.managers.k8s.persistentvolumes import \
    K8sPersistentVolumeManager
from tcp_tests.managers.k8s.pods import K8sPodManager
from tcp_tests.managers.k8s.replicationcontrollers import \
    K8sReplicationControllerManager
from tcp_tests.managers.k8s.resourcequotas import K8sResourceQuotaManager
from tcp_tests.managers.k8s.secrets import K8sSecretManager
from tcp_tests.managers.k8s.serviceaccounts import \
    K8sServiceAccountManager
from tcp_tests.managers.k8s.services import K8sServiceManager
from tcp_tests.managers.k8s.replicasets import K8sReplicaSetManager
from tcp_tests.managers.k8s.networkpolicies import K8sNetworkPolicyManager


class K8sCluster(object):
    def __init__(self, schema="https", user=None, password=None, ca=None,
                 host='localhost', port='443', default_namespace='default'):
        self.default_namespace = default_namespace

        api_server = '{0}://{1}:{2}'.format(schema, host, port)

        config_data = {
            'apiVersion': 'v1',
            'kind': 'Config',
            'preferences': {},
            'current-context': 'cluster-remote',
            'clusters': [{
                'name': 'cluster',
                'cluster': {
                    'server': api_server,
                    'certificate-authority-data': ca,
                },
            }],
            'users': [{
                'name': 'remote',
                'user': {
                    'password': password,
                    'username': user,
                },
            }],
            'contexts': [{
                'name': 'cluster-remote',
                'context': {
                    'cluster': 'cluster',
                    'user': 'remote',
                },
            }],
        }

        configuration = type.__call__(client.Configuration)
        loader = kubernetes.config.kube_config.KubeConfigLoader(config_data)
        loader.load_and_set(configuration)
        api_client = client.ApiClient(configuration=configuration)

        self.api_core = client.CoreV1Api(api_client)
        self.api_apps = client.AppsV1Api(api_client)
        self.api_extensions = client.ExtensionsV1beta1Api(api_client)
        self.api_autoscaling = client.AutoscalingV1Api(api_client)
        self.api_batch = client.BatchV1Api(api_client)

        self.nodes = K8sNodeManager(self)
        self.pods = K8sPodManager(self)
        self.endpoints = K8sEndpointsManager(self)
        self.namespaces = K8sNamespaceManager(self)
        self.services = K8sServiceManager(self)
        self.serviceaccounts = K8sServiceAccountManager(self)
        self.secrets = K8sSecretManager(self)
        self.events = K8sEventManager(self)
        self.limitranges = K8sLimitRangeManager(self)
        self.jobs = K8sJobManager(self)
        self.daemonsets = K8sDaemonSetManager(self)
        self.ingresses = K8sIngressManager(self)
        self.deployments = K8sDeploymentManager(self)
        self.horizontalpodautoscalers = K8sHorizontalPodAutoscalerManager(self)
        self.componentstatuses = K8sComponentStatusManager(self)
        self.resourcequotas = K8sResourceQuotaManager(self)
        self.replicationcontrollers = K8sReplicationControllerManager(self)
        self.pvolumeclaims = K8sPersistentVolumeClaimManager(self)
        self.pvolumes = K8sPersistentVolumeManager(self)
        self.replicasets = K8sReplicaSetManager(self)
        self.networkpolicies = K8sNetworkPolicyManager(self)
