from rest_framework import viewsets
from rest_framework.decorators import action
from api import models, serializers
from django.http import HttpResponse, FileResponse
from django.core.files.storage import FileSystemStorage
from pathlib import Path
from decouple import config
import os
import mimetypes
import logging

class PersonaViewSet(viewsets.ModelViewSet):
    queryset = models.Persona.objects.all()
    serializer_class = serializers.PersonaSerializer

    def destroy(self, request, pk=None):
        return HttpResponse('No permitido eliminar', status=405)
    
    def create(self, request):
        try:
            if 'photo' in request.data:
                fs = FileSystemStorage(location = config('PHOTOS_UPLOADS','/tmp'))
                fs.save(request.data['photo'], request.data['photo'])

            return super().create(request)
        except Exception as e:
            if e.detail['rut']:
                return HttpResponse(e.detail['rut'][0], status=400)
            return HttpResponse(e, status=400)


    def partial_update(self, request, pk=None):
        try:
            if 'photo' in request.data:
                # indicar el nombre con que se guardara el archivo
                archivo = request.data['photo']
                extension = Path(archivo.name).suffix
                nombre_archivo = f'{pk}{extension}'

                # guardar el archivo en la carpeta
                fs = FileSystemStorage(location = config('PHOTOS_UPLOADS','/tmp'))

                # Sobrescribir el archivo si ya existe
                if fs.exists(nombre_archivo):
                    fs.delete(nombre_archivo)

                fs.save(nombre_archivo, archivo)

            # proceder con guardar registro
            return super().partial_update(request, pk)
        except Exception as e:
            return HttpResponse(e, status=400)



    @action(detail=False, methods=['get'])
    def photo(self, request, *args, **kwargs):
        file_location = None
        try:
            rut = request.GET['id']
            folder = config('PHOTOS_UPLOADS','/tmp')

            file_location = os.path.join(folder, 'desconocido.jpg')
            file_query = os.path.join(folder, f'{rut}.png')
            if os.path.isfile(file_query):
                file_location = file_query
            else:
                file_query = os.path.join(folder, f'{rut}.jpg')
                if os.path.isfile(file_query):
                    file_location = file_query
                else:
                    file_query = os.path.join(folder, f'{rut}.jpeg')
                    if os.path.isfile(file_query):
                        file_location = file_query

            tipo_mime = mimetypes.guess_type(file_location)[0]
            nombre_archivo = os.path.basename(file_location)

            archivo = open(file_location, 'rb')
            response = FileResponse(archivo)
            response['Access-Control-Expose-Headers'] = 'Content-Disposition'
            response['Content-Type'] = tipo_mime
            response['Content-Disposition'] = f'inline; filename="{nombre_archivo}"' 
            return response
        except Exception as err:
            logging.error({ 'error': err, 'file_location': file_location })
            return HttpResponse('Error al descargar archivo', status=500)
