from rest_framework.decorators import api_view
from rest_framework.decorators import parser_classes
from rest_framework.decorators import permission_classes

from rest_framework.parsers import FileUploadParser
from rest_framework.permissions import IsAuthenticated
from rest_framework.exceptions import PermissionDenied
from rest_framework.exceptions import NotFound

from rest_framework.response import Response

from crashreports.serializers import LogFileSerializer

from crashreports.models import LogFile
from crashreports.models import Crashreport
from crashreports.permissions import user_owns_uuid
from crashreports.permissions import user_is_hiccup_staff
from crashreports.permissions import HasRightsOrIsDeviceOwnerDeviceCreation
from rest_framework import generics


class ListCreateView(generics.ListAPIView):
    queryset = LogFile.objects.all()
    permission_classes = (HasRightsOrIsDeviceOwnerDeviceCreation, )
    serializer_class = LogFileSerializer


class RetrieveUpdateDestroyView(generics.RetrieveUpdateDestroyAPIView):
    queryset = LogFile.objects.all()
    permission_classes = (HasRightsOrIsDeviceOwnerDeviceCreation, )
    serializer_class = LogFileSerializer


@api_view(http_method_names=['POST'], )
@parser_classes([FileUploadParser, ])
@permission_classes([IsAuthenticated, ])
def logfile_put(request, uuid, device_local_id, filename):
    try:
        crashreport = Crashreport.objects.get(device__uuid=uuid,
                                              device_local_id=device_local_id)
    except:
        raise NotFound(detail="Crashreport does not exist.")

    if (not (user_owns_uuid(request.user, crashreport.device.uuid)
             or user_is_hiccup_staff(request.user))):
        raise PermissionDenied(detail="Not allowed.")
    f = request.data["file"]
    logfile = LogFile(crashreport=crashreport, logfile=f)
    logfile.save()
    return Response(status=201)
