from lib.services.vpc.base_vpc_client import BaseVpcClient
from abc import ABC, abstractmethod


# Class of VPC client inherited BaseVpcClient
class VpcClient(BaseVpcClient):
    vpc_client = None

    def __init__(self, auth_provider, client, **kwargs):
        super().__init__(auth_provider=auth_provider, **kwargs)
        self.vpc_client = client

    def create_routing_gateway(self, req_body):
        return self.vpc_client.create_routing_gateway(vpc_base=self, req_body=req_body)

    def patch_routing_gateway(self, routing_gateway_name, update_body):
        return self.vpc_client.patch_routing_gateway(
            vpc_base=self,
            routing_gateway_name=routing_gateway_name,
            update_body=update_body,
        )

    def list_routing_gateway(self):
        return self.vpc_client.list_routing_gateway(vpc_base=self)

    def read_routing_gateway(self, routing_gateway_name):
        return self.vpc_client.read_routing_gateway(
            vpc_base=self, routing_gateway_name=routing_gateway_name
        )

    def delete_routing_gateway(self, routing_gateway_name):
        return self.vpc_client.delete_routing_gateway(
            vpc_base=self, routing_gateway_name=routing_gateway_name
        )

    def create_acl_policy(self, req_body):
        return self.vpc_client.create_acl_policy(vpc_base=self, req_body=req_body)

    def list_acl_policy(self):
        return self.vpc_client.list_acl_policy(vpc_base=self)

    def read_acl_policy(self, acl_policy_name):
        return self.vpc_client.read_acl_policy(
            vpc_base=self, acl_policy_name=acl_policy_name
        )

    def delete_acl_policy(self, acl_policy_name):
        return self.vpc_client.delete_acl_policy(
            vpc_base=self, acl_policy_name=acl_policy_name
        )

    def patch_acl_policy(self, acl_policy_name, update_body):
        return self.vpc_client.patch_acl_policy(
            vpc_base=self, acl_policy_name=acl_policy_name, update_body=update_body
        )

    def create_nat_gateway(self, req_body):
        return self.vpc_client.create_nat_gateway(vpc_base=self, req_body=req_body)

    def patch_nat_gateway(self, nat_gateway_name, update_body):
        return self.vpc_client.patch_nat_gateway(
            vpc_base=self,
            nat_gateway_name=nat_gateway_name,
            update_body=update_body,
        )

    def list_nat_gateway(self):
        return self.vpc_client.list_nat_gateway(vpc_base=self)

    def read_nat_gateway(self, nat_gateway_name):
        return self.vpc_client.read_nat_gateway(
            vpc_base=self, nat_gateway_name=nat_gateway_name
        )

    def delete_nat_gateway(self, nat_gateway_name):
        return self.vpc_client.delete_nat_gateway(
            vpc_base=self, nat_gateway_name=nat_gateway_name
        )

    def list_reserved_ip(self):
        return self.vpc_client.list_reserved_ip(vpc_base=self)

    def create_reserved_ip(self, req_body):
        return self.vpc_client.create_reserved_ip(vpc_base=self, req_body=req_body)

    def read_reserved_ip(self, reserved_ip_name):
        return self.vpc_client.read_reserved_ip(
            vpc_base=self, reserved_ip_name=reserved_ip_name
        )

    def delete_reserved_ip(self, reserved_ip_name):
        return self.vpc_client.delete_reserved_ip(
            vpc_base=self, reserved_ip_name=reserved_ip_name
        )

    def patch_reserved_ip(self, reserved_ip_name, update_body):
        return self.vpc_client.patch_reserved_ip(
            vpc_base=self, reserved_ip_name=reserved_ip_name, update_body=update_body
        )

    def create_vpc(self, req_body):
        return self.vpc_client.create_vpc(vpc_base=self, req_body=req_body)

    def read_vpc(self, vpc_name):
        return self.vpc_client.read_vpc(vpc_base=self, vpc_name=vpc_name)

    def delete_vpc(self, vpc_name):
        return self.vpc_client.delete_vpc(vpc_base=self, vpc_name=vpc_name)

    def list_vpc(self):
        return self.vpc_client.list_vpc(vpc_base=self)

    def patch_vpc(self, vpc_name, update_body):
        return self.vpc_client.patch_vpc(
            vpc_base=self, vpc_name=vpc_name, update_body=update_body
        )

    def create_external_ip(self, req_body):
        return self.vpc_client.create_external_ip(vpc_base=self, req_body=req_body)

    def read_external_ip(self, external_ip_name):
        return self.vpc_client.read_external_ip(
            vpc_base=self, external_ip_name=external_ip_name
        )

    def delete_external_ip(self, external_ip_name):
        return self.vpc_client.delete_external_ip(
            vpc_base=self, external_ip_name=external_ip_name
        )

    def patch_external_ip(self, external_ip_name, update_body):
        return self.vpc_client.patch_external_ip(
            vpc_base=self, external_ip_name=external_ip_name, update_body=update_body
        )

    def list_external_ip(self):
        return self.vpc_client.list_external_ip(vpc_base=self)

    def list_cluster_acl_policy(self):
        return self.vpc_client.list_cluster_acl_policy(vpc_base=self)

    def read_cluster_acl_policy(self, cluster_acl_policy_name):
        return self.vpc_client.read_cluster_acl_policy(
            vpc_base=self, cluster_acl_policy_name=cluster_acl_policy_name
        )


# Interface class for VPC Client
class VpcClientInterface(ABC):
    @abstractmethod
    def create_routing_gateway(self, **kwargs):
        pass

    @abstractmethod
    def patch_routing_gateway(self, **kwargs):
        pass

    @abstractmethod
    def list_routing_gateway(self, **kwargs):
        pass

    @abstractmethod
    def read_routing_gateway(self, **kwargs):
        pass

    @abstractmethod
    def delete_routing_gateway(self, **kwargs):
        pass

    @abstractmethod
    def create_acl_policy(self, **kwargs):
        pass

    @abstractmethod
    def list_acl_policy(self, **kwargs):
        pass

    @abstractmethod
    def read_acl_policy(self, **kwargs):
        pass

    @abstractmethod
    def delete_acl_policy(self, **kwargs):
        pass

    @abstractmethod
    def patch_acl_policy(self, **kwargs):
        pass

    @abstractmethod
    def create_nat_gateway(self, **kwargs):
        pass

    @abstractmethod
    def patch_nat_gateway(self, **kwargs):
        pass

    @abstractmethod
    def list_nat_gateway(self, **kwargs):
        pass

    @abstractmethod
    def read_nat_gateway(self, **kwargs):
        pass

    @abstractmethod
    def delete_nat_gateway(self, **kwargs):
        pass

    def list_reserved_ip(self, **kwargs):
        pass

    def create_reserved_ip(self, **kwargs):
        pass

    def read_reserved_ip(self, **kwargs):
        pass

    def delete_reserved_ip(self, **kwargs):
        pass

    def patch_reserved_ip(self, **kwargs):
        pass

    def create_vpc(self, **kwargs):
        pass

    def read_vpc(self, **kwargs):
        pass

    def delete_vpc(self, **kwargs):
        pass

    def list_vpc(self, **kwargs):
        pass

    def patch_vpc(self, **kwargs):
        pass

    def create_external_ip(self, **kwargs):
        pass

    def read_external_ip(self, **kwargs):
        pass

    def delete_external_ip(self, **kwargs):
        pass

    def patch_external_ip(self, **kwargs):
        pass

    def list_external_ip(self, **kwargs):
        pass



