# Create your views here.
from django.shortcuts import render, get_object_or_404, redirect
from django.contrib.auth.decorators import login_required

from rest_framework.response import Response
from rest_framework.decorators import api_view

from .models import Entrenador, Deportista, Macrociclo
from .forms import EntrenadorForm, DeportistaForm, MacrocicloForm
from .serializers import EntrenadorSerializer, DeportistaSerializer, MacrocicloSerializer


@login_required
def principal(request):
    entrenadores = Entrenador.objects.all()
    deportistas = Deportista.objects.all()

    return render(request, 'macrociclos/index.html', {'entrenadores': entrenadores, 'deportistas': deportistas})


# Vistas para los entrenadores
@login_required
def lista_entrenadores(request):
    entrenadores = Entrenador.objects.all()
    return render(request, 'macrociclos/lista_entrenadores.html', {'entrenadores': entrenadores})


@login_required
def nuevo_entrenador(request):
    if request.method == 'POST':
        form = EntrenadorForm(request.POST, request.FILES)
        if form.is_valid():
            form.save()
            return redirect('macrociclos:lista_entrenadores')
    else:
        form = EntrenadorForm()
    return render(request, 'macrociclos/form_entrenador.html', {'form': form})


@login_required
def editar_entrenador(request, entrenador_id):
    entrenador = get_object_or_404(Entrenador, pk=entrenador_id)
    if request.method == 'POST':
        form = EntrenadorForm(request.POST, request.FILES, instance=entrenador)
        if form.is_valid():
            form.save()
            return redirect('macrociclos:lista_entrenadores')
    else:
        form = EntrenadorForm(instance=entrenador)
    return render(request, 'macrociclos/form_entrenador.html', {'form': form})


@login_required
def eliminar_entrenador(request, entrenador_id):
    entrenador = get_object_or_404(Entrenador, pk=entrenador_id)
    entrenador.delete()
    return redirect('macrociclos:lista_entrenadores')


# Vistas para los deportistas
@login_required
def lista_deportistas(request):
    deportistas = Deportista.objects.all()
    return render(request, 'macrociclos/lista_deportistas.html', {'deportistas': deportistas})


@login_required
def nuevo_entrenador(request):

    entrenadores = Entrenador.objects.all()  # vamos a ver si hay vehículos dados de alta

    if entrenadores:
        if request.method == 'POST':
            form = DeportistaForm(request.POST, request.FILES)
            if form.is_valid():
                instancia = form.save(commit=False)

                aplica_descuento = form.cleaned_data['aplica_descuento']

                if aplica_descuento:
                    instancia.descuento = float(instancia.importe) * 0.03
                else:
                    instancia.descuento = 0.0

                instancia.importe = float(instancia.importe) - instancia.descuento

                if instancia.litros > 0:
                    instancia.precioxlitro = round(instancia.importe / float(instancia.litros), 2)
                else:
                    instancia.precioxlitro = 0

                # lee todos los deportistas del vehículo
                # deportistas = Deportistas.query.filter_by(entrenador_id=entrenador_id).all()

                if Deportista.objects.filter(entrenador_id=instancia.entrenador):
                    deportistas = Deportista.objects.filter(entrenador_id=instancia.entrenador).order_by('-fecha')[0]

                    instancia.kmsrecorridos = instancia.kms - deportistas.kms

                    if instancia.kmsrecorridos > 0:
                        instancia.consumo = round(instancia.litros * 100 / instancia.kmsrecorridos, 2)
                else:
                    instancia.kmsrecorridos = 0
                    instancia.consumo = 0

                instancia.save()

                return redirect('macrociclos:lista_deportistas')
        else:
            form = DeportistaForm()
        return render(request, 'macrociclos/form_entrenador.html', {'form': form})
    else:
        return render(request, 'macrociclos/index.html')


@login_required
def editar_entrenador(request, entrenador_id):
    entrenador = get_object_or_404(Deportista, pk=entrenador_id)

    if request.method == 'POST':
        form = DeportistaForm(request.POST, request.FILES, instance=entrenador)
        if form.is_valid():
            form.save()
            return redirect('macrociclos:lista_deportistas')
    else:
        form = DeportistaForm(instance=entrenador)
    return render(request, 'macrociclos/form_entrenador.html', {'form': form})


@login_required
def eliminar_entrenador(request, entrenador_id):
    entrenador = Deportista.objects.get(pk=entrenador_id)
    entrenador.delete()
    return redirect('macrociclos:lista_deportistas')


# Vistas para los macrociclos
@login_required
def lista_macrociclos(request):
    macrociclos = Macrociclo.objects.all()
    return render(request, 'macrociclos/lista_macrociclos.html', {'macrociclos': macrociclos})

@login_required
def nuevo_macrociclo(request):
    if request.method == 'POST':
        form = MacrocicloForm(request.POST)
        if form.is_valid():
            form.save()
            return redirect('macrociclos:lista_macrociclos')
    else:
        form = MacrocicloForm()
    return render(request, 'macrociclos/form_macrociclo.html', {'form': form})

@login_required
def detalle_macrociclo(request, macrociclo_id):
    macrociclo = get_object_or_404(Macrociclo, pk=macrociclo_id)
    return render(request, 'macrociclos/detalle_macrociclo.html', {'macrociclo': macrociclo})

@login_required
def editar_macrociclo(request, macrociclo_id):
    macrociclo = get_object_or_404(Macrociclo, pk=macrociclo_id)
    if request.method == 'POST':
        form = MacrocicloForm(request.POST, instance=macrociclo)
        if form.is_valid():
            form.save()
            return redirect('macrociclos:lista_macrociclos')
    else:
        form = MacrocicloForm(instance=macrociclo)
    return render(request, 'macrociclos/form_macrociclo.html', {'form': form})

@login_required
def eliminar_macrociclo(request, macrociclo_id):
    macrociclo = get_object_or_404(Macrociclo, pk=macrociclo_id)
    macrociclo.delete()
    return redirect('macrociclos:lista_macrociclos')

#
# API
#

@api_view(['GET'])
def api_lista_entrenadores(request):
    """Devuelve la lista de todos los entrenadores."""
    entrenadores = Entrenador.objects.all()
    serializer = EntrenadorSerializer(entrenadores, many=True)
    return Response(serializer.data)


@api_view(['GET'])
def api_detalle_entrenador(request, entrenador_id):
    """Devuelve los detalles de un entrenador específico."""
    try:
        entrenador = Entrenador.objects.get(id=entrenador_id)
        serializer = EntrenadorSerializer(entrenador)
        return Response(serializer.data)
    except Entrenador.DoesNotExist:
        return Response({'error': 'Entrenador no encontrado'}, status=404)


@api_view(['GET'])
def api_lista_deportistas(request):
    """Devuelve la lista de todos los deportistas."""
    deportistas = Deportista.objects.all()
    serializer = DeportistaSerializer(deportistas, many=True)
    return Response(serializer.data)


@api_view(['GET'])
def api_detalle_deportista(request, entrenador_id):
    """Devuelve los detalles de un entrenador específico."""
    try:
        entrenador = Deportista.objects.get(id=entrenador_id)
        serializer = DeportistaSerializer(entrenador)
        return Response(serializer.data)
    except Deportista.DoesNotExist:
        return Response({'error': 'Deportista no encontrado'}, status=404)

@api_view(['GET'])
def api_lista_macrociclos(request):
    """Devuelve la lista de todos los macrociclos."""
    macrociclos = Macrociclo.objects.all()
    serializer = MacrocicloSerializer(macrociclos, many=True)
    return Response(serializer.data)

@api_view(['GET'])
def api_detalle_macrociclo(request, macrociclo_id):
    """Devuelve los detalles de un macrociclo específico."""
    try:
        macrociclo = Macrociclo.objects.get(id=macrociclo_id)
        serializer = MacrocicloSerializer(macrociclo)
        return Response(serializer.data)
    except Macrociclo.DoesNotExist:
        return Response({'error': 'Macrociclo no encontrado'}, status=404)