"""
Author: Michel Peltriaux
Organization: Struktur- und Genehmigungsdirektion Nord, Rhineland-Palatinate, Germany
Contact: michel.peltriaux@sgdnord.rlp.de
Created on: 21.01.22

"""
import json

from django.http import JsonResponse, HttpRequest

from api.utils.serializer.v1.compensation import CompensationAPISerializerV1
from api.utils.serializer.v1.ecoaccount import EcoAccountAPISerializerV1
from api.utils.serializer.v1.ema import EmaAPISerializerV1
from api.utils.serializer.v1.intervention import InterventionAPISerializerV1
from api.views.views import AbstractModelAPIView


class AbstractModelAPIViewV1(AbstractModelAPIView):
    """ Holds general serialization functions for API v1

    """

    def get(self, request: HttpRequest, id=None):
        """ Handles the GET request

        Performs the fetching and serialization of the data

        Args:
            request (HttpRequest): The incoming request
            id (str): The entries id

        Returns:

        """
        try:
            if id is None:
                raise AttributeError("No id provided")
            self.serializer.prepare_lookup(id, self.user)
            data = self.serializer.fetch_and_serialize()
        except Exception as e:
            return self.return_error_response(e, 500)
        return JsonResponse(data)

    def post(self, request: HttpRequest, id=None):
        try:
            body = request.body.decode("utf-8")
            body = json.loads(body)
            created_id = self.serializer.create_model_from_json(body, self.user)
        except Exception as e:
            return self.return_error_response(e, 500)
        return JsonResponse({"id": created_id})

    def put(self, request: HttpRequest, id=None):
        try:
            body = request.body.decode("utf-8")
            body = json.loads(body)
            updated_id = self.serializer.update_model_from_json(id, body, self.user)
        except Exception as e:
            return self.return_error_response(e, 500)
        return JsonResponse({"id": updated_id})


class InterventionAPIViewV1(AbstractModelAPIViewV1):
    serializer = InterventionAPISerializerV1


class CompensationAPIViewV1(AbstractModelAPIViewV1):
    serializer = CompensationAPISerializerV1


class EcoAccountAPIViewV1(AbstractModelAPIViewV1):
    serializer = EcoAccountAPISerializerV1


class EmaAPIViewV1(AbstractModelAPIViewV1):
    serializer = EmaAPISerializerV1