
from django.db import transaction
from django.http import HttpResponse
from django.http import JsonResponse
from django.core.serializers import serialize

from rest_framework import viewsets
from rest_framework.response import Response
from rest_framework.decorators import action, api_view, schema

from .. import models, schemas, serializers
from ..validaciones import rut_valido
import json

class UsuarioViewSet(viewsets.ModelViewSet):
    queryset = models.Usuario.objects.all()
    serializer_class = serializers.UsuarioSerializer
    schema = schemas.UsuarioSchema()

    def retrieve(self, request, pk=None):
        print({ 'pk': pk })
        data = super().retrieve(request, pk)
        print({ 'data': data })
        return data

    def create(self, request):
        try:
            with transaction.atomic():
                input = json.loads(request.body)
                rut_completo = f"{input['rut']}-{input.get('dv','?')}"

                if not rut_valido(rut_completo):
                    raise ValueError(f"RUT [{input['rut']}] no valido!")

                usuario = models.Usuario.objects.filter(login = input['login']).first()
                if usuario:
                    raise ValueError(f"Usuario [{input['login']}] ya existe!")
                
                usuario = models.Usuario.objects.filter(rut = input['rut']).first()
                if usuario:
                    raise ValueError(f"Usuario con RUT [{input['rut']}] ya existe!")
                
                persona = models.Persona.objects.filter(rut = input['rut']).first()
                id_tipo_tratamiento = input.get('id_tipo_tratamiento',None)
                if not id_tipo_tratamiento:
                    id_tipo_tratamiento = None
                
                if not persona:
                    persona = models.Persona(
                        rut = input['rut'],
                        dv = input['dv'],
                        nombres = input['nombres'],
                        apellido_a = input.get('apellido_a',None),
                        apellido_b = input.get('apellido_b',None),
                        email = input.get('email',None),
                        id_tipo_tratamiento = id_tipo_tratamiento
                    )
                    persona.save()
                else:
                    persona.nombres = input['nombres']
                    persona.apellido_a = input.get('apellido_a',None)
                    persona.apellido_b = input.get('apellido_b',None)
                    persona.email = input.get('email',None)
                    persona.id_tipo_tratamiento = id_tipo_tratamiento
                    persona.save()

                usuario = models.Usuario(
                    rut = persona,
                    login = input['login'],
                    clave = input['clave'],
                    vigente = input.get('vigente', False),
                )
                usuario.save()
            
            return Response({
                'rut': persona.rut,
                'dv': persona.dv,
                'nombres': persona.nombres,
                'apellido_a': persona.apellido_a,
                'apellido_b': persona.apellido_b,
                'email': persona.email,
                'login': usuario.login,
                'vigente': usuario.vigente,
            })
        
        except ValueError as e:
            transaction.rollback()
            return HttpResponse(str(e), status = 400)
        
        except Exception as e:
            transaction.rollback()
            print(e)
            return HttpResponse(str(e), status = 500)
