from rest_framework import status
from rest_framework.response import Response
from rest_framework.views import APIView

from .models import ApiCredential
from .serializers import ApiCredentialSerializer


def add_cors_headers(response):
    response["Access-Control-Allow-Origin"] = "http://localhost:3000"
    response["Access-Control-Allow-Methods"] = "GET, POST, PATCH, DELETE, OPTIONS"
    response["Access-Control-Allow-Headers"] = "Content-Type"
    return response


def format_item(item):
    formatted = dict(item)
    formatted["api_secret"] = formatted.pop("masked_api_secret", "")
    formatted["login_token"] = formatted.pop("masked_login_token", "")
    formatted["password"] = formatted.pop("masked_password", "")
    return formatted


def format_results(items):
    return [format_item(item) for item in items]


class ApiCredentialListCreateView(APIView):
    def options(self, request, *args, **kwargs):
        return add_cors_headers(Response(status=status.HTTP_204_NO_CONTENT))

    def get(self, request):
        credentials = ApiCredential.objects.all()
        serializer = ApiCredentialSerializer(credentials, many=True)
        return add_cors_headers(Response({"results": format_results(serializer.data)}))

    def post(self, request):
        serializer = ApiCredentialSerializer(data=request.data)
        if not serializer.is_valid():
            return add_cors_headers(Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST))

        credential = serializer.save()
        response_serializer = ApiCredentialSerializer(credential)
        return add_cors_headers(
            Response(format_item(response_serializer.data), status=status.HTTP_201_CREATED)
        )


class ApiCredentialDetailView(APIView):
    def options(self, request, *args, **kwargs):
        return add_cors_headers(Response(status=status.HTTP_204_NO_CONTENT))

    def patch(self, request, pk):
        try:
            credential = ApiCredential.objects.get(pk=pk)
        except ApiCredential.DoesNotExist:
            return add_cors_headers(Response(status=status.HTTP_404_NOT_FOUND))

        serializer = ApiCredentialSerializer(credential, data=request.data, partial=True)
        if not serializer.is_valid():
            return add_cors_headers(Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST))

        credential = serializer.save()
        response_serializer = ApiCredentialSerializer(credential)
        return add_cors_headers(Response(format_item(response_serializer.data)))

    def delete(self, request, pk):
        try:
            credential = ApiCredential.objects.get(pk=pk)
        except ApiCredential.DoesNotExist:
            return add_cors_headers(Response(status=status.HTTP_404_NOT_FOUND))

        credential.delete()
        return add_cors_headers(Response(status=status.HTTP_204_NO_CONTENT))
