import json
from abc import ABC, abstractmethod
from lib.common import rest_client
from lib.services.api_gateway.base_client import BaseClient


class AccessControlClient(BaseClient):
    """Service client for API Gateway Access Control resource."""

    def __init__(self, auth_provider, service, region, client=None, **kwargs):
        super(AccessControlClient, self).__init__(auth_provider, service, region, **kwargs)
        self.client = client

    def _parse_response(self, resp, body, schema):
        """Parse and validate response."""
        if body:
            body = json.loads(body)
        else:
            body = {}
        self.validate_response(schema, resp, body)
        return rest_client.ResponseBody(resp, body)

    def create_iam_role(self, **kwargs):
        """Create an IAM role."""
        url = self.client.get_iam_roles_path(self.project_name)
        post_body = json.dumps(kwargs)
        resp, body = self.post(url, post_body)
        return self._parse_response(
            resp, body, self.client.get_schema().create_iam_role
        )

    def show_iam_role(self, iam_role):
        """Show IAM role details."""
        url = f"{self.client.get_iam_roles_path(self.project_name)}/{iam_role}"
        resp, body = self.get(url)
        return self._parse_response(
            resp, body, self.client.get_schema().show_iam_role
        )

    def delete_iam_role(self, iam_role):
        """Delete an IAM role."""
        url = f"{self.client.get_iam_roles_path(self.project_name)}/{iam_role}"
        resp, body = self.delete(url)
        return self._parse_response(
            resp, body, self.client.get_schema().delete_iam_role
        )


class AccessControlClientInterface(ABC):
    """Interface for cloud-specific implementations."""

    @abstractmethod
    def get_schema(self):
        """Return response schemas module."""
        pass

    @abstractmethod
    def get_iam_roles_path(self, project):
        """Return API endpoint path for IAM roles."""
        pass
