from server_backsemot.models import CamionGD, ClienteGD, Personal, PesajeGD
from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger
from rest_framework.decorators import api_view
from server_backsemot.utiles import *
from server_backsemot.personal.personal import validaciones_basicas, mantener_personal_activo, buscar_personal_activo
from server_backsemot.api.errorlog import guardar_error
from server_backsemot.personal.accionUsuario import registrar_accion
import traceback
import json
import sys


@api_view(["POST"])
def crear_camiongd(request):
    try:
        # Validación de permisos y autenticación
        validacion = validaciones_basicas(validaciones=[1, 2, 3, 4], perfiles=[1, 2, 3], request=request)
        if validacion != "ok":
            return Utiles.responder_500(validacion)
        
        cliente_id = request.POST["cliente"]
        patente = request.POST["patente"]
        unidad = request.POST.get("unidad")

        if unidad:
            if unidad != "toneladas" and unidad != "m3":
                return Utiles.responder_500("El valor de unidad debe ser toneladas o m3")
            
            if unidad == "m3":
                cantidad = request.POST.get("cantidad")
                if not cantidad:
                    return Utiles.responder_500("Si el camión se medirá por m3 debe enviar la cantidad de m3 para registrar el camión")
                
                try:
                    cantidad = float(cantidad)
                except ValueError:
                    return Utiles.responder_500("Cantidad debe ser un valor numérico")

        try:
            cliente = ClienteGD.objects.get(id=cliente_id)
        except ClienteGD.DoesNotExist:
            return Utiles.responder_500("No existe cliente con el id indicado")
        
        if not Utiles.valida_patente(patente):
            return Utiles.responder_500("Debe ingresar una patente válida")
        
        if CamionGD.objects.filter(patente=patente, cliente=cliente).exists():
            return Utiles.responder_500("Ya existe un vehículo con la patente indicada registrado para el cliente")
        
        camion = CamionGD()
        camion.cliente = cliente
        camion.patente = patente
        camion.unidad = unidad
        if unidad == "m3":
            camion.peso_tara = cantidad
        else :
            camion.peso_tara = 0
        camion.save()

        return Utiles.responder_200("Vehículo registrado correctamente")
    except:
        return Utiles.responder_500("Error inesperado", sys.exc_info())



@api_view(["POST"])
def modificar_camiongd(request):
    try:
        # Validación de permisos y autenticación
        validacion = validaciones_basicas(validaciones=[1, 2, 3, 4], perfiles=[1, 2, 3], request=request)
        if validacion != "ok":
            return Utiles.responder_500(validacion)
        
        id = request.POST["id"]
        cliente_id = request.POST["cliente"]
        patente = request.POST["patente"]
        unidad = request.POST.get("unidad")

        camion = CamionGD.objects.get(id=id)

        if unidad:
            if unidad != "toneladas" and unidad != "m3":
                return Utiles.responder_500("El valor de unidad debe ser toneladas o m3")
            
            if unidad == "m3":
                cantidad = request.POST.get("cantidad")
                if not cantidad:
                    return Utiles.responder_500("Si el camión se medirá por m3 debe enviar la cantidad de m3 para registrar el camión")
                
                try:
                    cantidad = float(cantidad)
                except ValueError:
                    return Utiles.responder_500("Cantidad debe ser un valor numérico")

        try:
            cliente = ClienteGD.objects.get(id=cliente_id)
        except ClienteGD.DoesNotExist:
            return Utiles.responder_500("No existe cliente con el id indicado")
        
        if not Utiles.valida_patente(patente):
            return Utiles.responder_500("Debe ingresar una patente válida")
        
        if CamionGD.objects.filter(patente=patente, cliente=cliente).exclude(id=id).exists():
            return Utiles.responder_500("Ya existe un vehículo con la patente indicada registrado para el cliente")
        
        camion.cliente = cliente
        camion.patente = patente
        camion.unidad = unidad
        if unidad == "m3":
            camion.peso_tara = cantidad
        else:
            camion.peso_tara = 0
        camion.save()

        return Utiles.responder_200("Vehículo modificado correctamente")
    except CamionGD.DoesNotExist:
        return Utiles.responder_500("No existe camión con el id indicado")
    except:
        return Utiles.responder_500("Error inesperado", sys.exc_info())



@api_view(["POST"])
def activar_camiongd(request):
    try:
        # Validación de permisos y autenticación
        validacion = validaciones_basicas(validaciones=[1, 2, 3, 4], perfiles=[1, 2, 3], request=request)
        if validacion != "ok":
            return Utiles.responder_500(validacion)
        
        id = request.POST["id"]

        try:
            camion = CamionGD.objects.get(id=id)
        except CamionGD.DoesNotExist:
            return Utiles.responder_500("No existe vehículo con el id indicado")
        
        if camion.activo == 1:
            return Utiles.responder_200("El vehículo ya se encuentra activo")
        
        camion.activo = 1
        camion.save()

        return Utiles.responder_200("Vehículo activado correctamente")
    except:
        return Utiles.responder_500("Error inesperado", sys.exc_info())



@api_view(["POST"])
def desactivar_camiongd(request):
    try:
        # Validación de permisos y autenticación
        validacion = validaciones_basicas(validaciones=[1, 2, 3, 4], perfiles=[1, 2, 3], request=request)
        if validacion != "ok":
            return Utiles.responder_500(validacion)
        
        id = request.POST["id"]

        try:
            camion = CamionGD.objects.get(id=id)
        except CamionGD.DoesNotExist:
            return Utiles.responder_500("No existe vehículo con el id indicado")
        
        if camion.activo == 0:
            return Utiles.responder_200("El vehículo ya se encuentra inactivo")
        
        camion.activo = 0
        camion.save()

        return Utiles.responder_200("Vehículo desactivado correctamente")
    except:
        return Utiles.responder_500("Error inesperado", sys.exc_info())



def formatear_camiongd(c: CamionGD):
    try:
        cliente = c.cliente

        pesaje = PesajeGD.objects.filter(camion=c).order_by("-fecha").first()

        datos = {
            "id": c.id,
            "cliente_id": cliente.id if cliente else None,
            "cliente": cliente.nombre if cliente else None,
            "peso_tara": c.peso_tara,
            "unidad": c.unidad,
            "patente": c.patente,
            "activo": c.activo,
            "fecha_ultimo_pesaje": pesaje.fecha if pesaje else None,
            "peso_ultimo_pesaje": pesaje.peso if pesaje else None
        }

        return datos

    except Exception:
        traceback.print_exc()
        return {
            "id": c.id,
            "error": "Error al formatear camión"
        }



@api_view(["GET"])
def buscar_camionesgd_cliente(request):
    try:
        # Validación de permisos y autenticación
        validacion = validaciones_basicas(validaciones=[1, 2, 3, 4], perfiles=[1, 2, 3], request=request)
        if validacion != "ok":
            return Utiles.responder_500(validacion)
        
        cliente_id = request.GET["cliente"]

        try:
            cliente = ClienteGD.objects.get(id=cliente_id)
        except ClienteGD.DoesNotExist:
            return Utiles.responder_500("No existe vehículo con el id indicado")
        
        camiones = CamionGD.objects.filter(cliente=cliente).all()
        if not camiones:
            return Utiles.responder_500("El cliente indicado no tiene vehículos activos registrados")
        
        datos = [formatear_camiongd(c) for c in camiones]

        return Utiles.responder_200("Camiones", datos)
    except:
        traceback.print_exc()
        return Utiles.responder_500("Error inesperado", sys.exc_info())



@api_view(["GET"])
def buscar_camionesgd_cliente_venta(request):
    try:
        # Validación de permisos y autenticación
        validacion = validaciones_basicas(validaciones=[1, 2, 3, 4], perfiles=[1, 2, 3], request=request)
        if validacion != "ok":
            return Utiles.responder_500(validacion)
        
        cliente_id = request.GET["cliente"]

        try:
            cliente = ClienteGD.objects.get(id=cliente_id)
        except ClienteGD.DoesNotExist:
            return Utiles.responder_500("No existe vehículo con el id indicado")
        
        camiones = CamionGD.objects.filter(cliente=cliente, activo=1).all()
        if not camiones:
            return Utiles.responder_500("El cliente indicado no tiene vehículos activos registrados")
        
        datos = [formatear_camiongd(c) for c in camiones]

        return Utiles.responder_200("Camiones", datos)
    except:
        return Utiles.responder_500("Error inesperado", sys.exc_info())



@api_view(["GET"])
def buscar_camionesgd_patente(request):
    try:
        # Validación de permisos y autenticación
        validacion = validaciones_basicas(validaciones=[1, 2, 3, 4], perfiles=[1, 2, 3], request=request)
        if validacion != "ok":
            return Utiles.responder_500(validacion)
        
        patente = request.GET["patente"]
        
        camiones = CamionGD.objects.filter(patente=patente).all()
        if not camiones:
            return Utiles.responder_500("No existen vehículos con la patente indicada")
        
        datos = [formatear_camiongd(c) for c in camiones]

        return Utiles.responder_200("Camiones", datos)
    except:
        return Utiles.responder_500("Error inesperado", sys.exc_info())