from usuarios.permissions import IsClubAdmin, IsClubStaff, is_self_or_staff
import json
from datetime import datetime

from django.db import IntegrityError
from django.shortcuts import render
from drf_yasg import openapi
from drf_yasg.utils import swagger_auto_schema
from rest_framework import status
from rest_framework.decorators import api_view, permission_classes
from rest_framework.permissions import AllowAny, IsAuthenticated
from rest_framework.response import Response

from finanzas.models import PlanSuscripciones, Suscripciones, Pago
from finanzas.utils import count_monthly_occurrences
from usuarios.models import Usuarios


# Create your views here.
@swagger_auto_schema(
    method='post',
    operation_description="Agregar un nuevo plan de suscripción",
    tags=["Planes de Suscripcion"],
    security=[{'Bearer': []}],
    request_body=openapi.Schema(
        type=openapi.TYPE_OBJECT,
        properties={
            "name": openapi.Schema(type=openapi.TYPE_STRING, description="Nombre del plan de suscripción"),
            "description": openapi.Schema(type=openapi.TYPE_STRING, description="Decripción del plan de suscripción"),
            "price": openapi.Schema(type=openapi.TYPE_INTEGER, description="Precio del plan de suscripción"),
            "interval": openapi.Schema(type=openapi.TYPE_INTEGER, description="Intervalo del plan de suscripción"),
            "intervalCount": openapi.Schema(type=openapi.TYPE_INTEGER, description="Contador de intervalo de plan de suscripción"),
            "active": openapi.Schema(type=openapi.TYPE_BOOLEAN, description="Vigencia del plan de suscripción"),
        },
        required=["name", "username", "email", "password", "tipo_id"],
    ),
    responses={
        201: openapi.Response(description="Usuario creado exitosamente"),
        404: openapi.Response(description="Tipo de usuario no encontrado"),
        400: openapi.Response(description="Solicitud inválida"),
    },
)
@api_view(['POST'])
@permission_classes([IsClubAdmin])
def addSuscriptionsPlans(request):
    try:
        body = json.loads(request.body)

        name = body.get("name")
        description = body.get("description")
        price = body.get("price")
        interval = body.get("interval")
        intervalCount = body.get("intervalCount")
        active = body.get("active")

        if not all([name, description, price, interval, intervalCount]):
            return Response({"message": "Todos los campos son obligatorios"}, status=status.HTTP_400_BAD_REQUEST)

        try:
            planSuscription = PlanSuscripciones.objects.create(
                name=name,
                description=description,
                price=price,
                interval=interval,
                intervalCount=intervalCount,
                active=active
            )
        except IntegrityError as error:
            if 'name' in str(error):
                return Response({"error": f"El nombre '{name}' ya está registrado"}, status=status.HTTP_400_BAD_REQUEST)
        except Exception as error:
            return Response({"error": f"Error inesperado: {str(error)}"}, status=status.HTTP_500_INTERNAL_SERVER_ERROR)

        return Response({
            "message": "Plan de suscripción creado con éxito",
            "planSuscripcion": {
                "id": planSuscription.id,
                "name": planSuscription.name,
                "description": planSuscription.description,
                "price": planSuscription.price,
                "interval": planSuscription.interval,
                "intervalCount": planSuscription.intervalCount,
                "active": planSuscription.active
            }
        })


    except json.JSONDecodeError as error:
        return Response({"message": "Ocurrio un error inesperado"}, status=status.HTTP_500_INTERNAL_SERVER_ERROR)

@swagger_auto_schema(
    method='get',
    operation_description="Obtener los detalles de los planes de suscripción",
    tags=["Planes de Suscripcion"],
    security=[{'Bearer': []}],
    responses={
        200: openapi.Response(
            description="Planes de suscripciones listados con éxito",
            examples={
                "application/json": [
                    {
                        "id": 1,
                        "name": "Juan Pérez",
                        "description": "juanp",
                        "price": 12000,
                        "interval": "Mensual",
                        "intervalCount": 2,
                        "active": True,
                    },
                    {
                        "id": 2,
                        "name": "Juan Pérez",
                        "description": "juanp",
                        "price": 12000,
                        "interval": "Mensual",
                        "intervalCount": 2,
                        "active": True,
                    }
                ]
            },
        ),
        500: openapi.Response(description="Ocurrio un error inesperado"),
    },
)
@api_view(['GET'])
@permission_classes([IsAuthenticated])
def listSuscriptionPlans(request):
    try:
        planSuscriptions = PlanSuscripciones.objects.all()
        data = [
            {
                "id": planSuscrip.id,
                "name": planSuscrip.name,
                "description": planSuscrip.description,
                "price": planSuscrip.price,
                "interval": planSuscrip.interval,
                "intervalCount": planSuscrip.intervalCount,
                "active": planSuscrip.active
            }
            for planSuscrip in planSuscriptions
        ]

        return Response(data, status=status.HTTP_200_OK)
    except json.JSONDecodeError as error:
        return Response({"message": "Ocurrio un error inesperado"}, status=status.HTTP_500_INTERNAL_SERVER_ERROR)

@swagger_auto_schema(
    method='put',
    operation_description="Actualizar un plan de suscripción por ID",
    tags=["Planes de Suscripcion"],
    security=[{'Bearer': []}],
    request_body=openapi.Schema(
        type=openapi.TYPE_OBJECT,
        properties={
            "name": openapi.Schema(type=openapi.TYPE_STRING, description="Nombre del plan de suscripción"),
            "description": openapi.Schema(type=openapi.TYPE_STRING, description="Categoria del plan de suscripción"),
            "price": openapi.Schema(type=openapi.TYPE_INTEGER, description="Precio del plan de suscripción"),
            "interval": openapi.Schema(type=openapi.TYPE_INTEGER, description="Intervalo de plan de suscripción"),
            "intervalCount": openapi.Schema(type=openapi.TYPE_INTEGER, description="Contado de intervalo de plan de suscripción"),
            "active": openapi.Schema(type=openapi.TYPE_BOOLEAN, description="Vigencia de plan de suscripción"),
        },
    ),
    responses={
        200: openapi.Response(description="Plan de suscripcion actualizado con éxito"),
        404: openapi.Response(description="Plan de suscripción no encontrado"),
        500: openapi.Response(description="Ocurrio un error inesperado"),
    },
)
@api_view(['PUT'])
@permission_classes([IsClubAdmin])
def editSuscriptionPlans(request, id):
    try:
        plansSuscription = PlanSuscripciones.objects.get(id=id)
        body = json.loads(request.body)

        if "name" in body:
            plansSuscription.name = body["name"]
        if "description" in body:
            plansSuscription.description = body["description"]
        if "price" in body:
            plansSuscription.price = body["price"]
        if "interval" in body:
            plansSuscription.interval = body["interval"]
        if "intervalCount" in body:
            plansSuscription.intervalCount = body["intervalCount"]
        if "active" in body:
            plansSuscription.active = body["active"]

        plansSuscription.save()

        return Response({
            "message": "Plan de suscripcion actualizado con éxito",
            "planSuscripcion": {
                "id": plansSuscription.id,
                "name": plansSuscription.name,
                "description": plansSuscription.description,
                "price": plansSuscription.price,
                "interval": plansSuscription.interval,
                "intervalCount": plansSuscription.intervalCount,
                "active": plansSuscription.active
            }
        }, status=status.HTTP_200_OK)
    except PlanSuscripciones.DoesNotExist:
        return Response({"error": "Plan de suscripción no encontrado"}, status=status.HTTP_404_NOT_FOUND)

    except json.JSONDecodeError as error:
        return Response({"message": "Ocurrio un error inesperado"}, status=status.HTTP_500_INTERNAL_SERVER_ERROR)

@swagger_auto_schema(
    method='delete',
    operation_description="Eliminar un usuario por ID",
    tags=["Planes de Suscripcion"],
    security=[{'Bearer': []}],
    responses={
        200: openapi.Response(description="Plan de suscripcion eliminado con éxito"),
        404: openapi.Response(description="Plan de suscripción no encontrado"),
        500: openapi.Response(description="Ocurrio un error inesperado"),
    },
)
@api_view(['DELETE'])
@permission_classes([IsClubAdmin])
def deleteSuscriptionPlans(request, id):
    try:
        planSuscripcion = PlanSuscripciones.objects.get(id=id)
        planSuscripcion.delete()
        return Response({"message": "Plan de suscripcion eliminado con éxito"}, status=status.HTTP_200_OK)
    except PlanSuscripciones.DoesNotExist:
        return Response({"error": "Plan de suscripción no encontrado"}, status=status.HTTP_404_NOT_FOUND)
    except json.JSONDecodeError as error:
        return Response({"message": "Ocurrio un error inesperado"}, status=status.HTTP_500_INTERNAL_SERVER_ERROR)



DATE_FMT = "%d-%m-%Y"
@swagger_auto_schema(
    method='post',
    operation_description="Asignación masiva de Suscripciones",
    tags=["Planes de Suscripcion"],
    security=[{'Bearer': []}],
    request_body=openapi.Schema(
        type=openapi.TYPE_OBJECT,
        properties={
            "planId": openapi.Schema(type=openapi.TYPE_STRING, description="ID del plan de suscripcion"),
            "status": openapi.Schema(type=openapi.TYPE_STRING, description="Estado de la suscripcion"),
            "startDate": openapi.Schema(type=openapi.TYPE_STRING, description="Fecha de inicio de suscripción"),
            "endDate": openapi.Schema(type=openapi.TYPE_STRING, description="Fecha de termino de la suscripción"),
            "nextBillingDate": openapi.Schema(type=openapi.TYPE_STRING, description="Fecha de próximo pago de la suscripción"),
            "canceledAt": openapi.Schema(type=openapi.TYPE_INTEGER, description="Fecha de cancelación de suscripción")
        },
        required=["planId", "status", "startDate", "endDate", "nextBillingDate", "canceledAt"],
    ),
    responses={
        201: openapi.Response(description="Usuario creado exitosamente"),
        404: openapi.Response(description="Tipo de usuario no encontrado"),
        400: openapi.Response(description="Solicitud inválida"),
    },
)
@api_view(['POST'])
@permission_classes([IsClubAdmin])
def asignPlanUsers(request):
    try:
        body = json.loads(request.body)
        plan_id = body.get("planId")
        status_field = body.get("status")
        start_date = body.get("startDate")
        end_date = body.get("endDate")
        next_billing_date = body.get("nextBillingDate")
        canceled_at = body.get("canceledAt") if body.get("canceledAt") else None

        totalMeses = count_monthly_occurrences(start_date, end_date)

        print("totalMeses", totalMeses)


        atletas = Usuarios.objects.filter(tipo=3)
        print(list(atletas))
        items = body.get("suscripciones", [])

        objs = []
        for it in atletas:
            # mapea/valida campos mínimos
            user_id = it.id

            # parsear fechas (si vienen vacías, manejar None)
            def parse_date(s):
                if not s:
                    return None
                return datetime.strptime(s, DATE_FMT).date()


            # Opción B: recuperar instancias relacionadas (opcional, pero valida que existan)
            user = Usuarios.objects.get(pk=user_id)
            plan = PlanSuscripciones.objects.get(pk=plan_id)

            objs.append(Suscripciones(
                userId=user,
                planId=plan,
                status=status_field,
                startDate=start_date,
                endDate=end_date,
                nextBillingDate=next_billing_date,
                canceledAt=canceled_at,
                totalMeses=totalMeses
            ))

        # bulk_create con instancias de modelo
        Suscripciones.objects.bulk_create(objs)

        return Response({"message": "Suscripción(es) creada(s) con éxito"}, status=status.HTTP_201_CREATED)

    except Usuarios.DoesNotExist:
        return Response({"message": "Usuario no encontrado"}, status=status.HTTP_400_BAD_REQUEST)
    except PlanSuscripciones.DoesNotExist:
        return Response({"message": "Plan no encontrado"}, status=status.HTTP_400_BAD_REQUEST)
    except json.JSONDecodeError:
        return Response({"message": "JSON inválido"}, status=status.HTTP_400_BAD_REQUEST)
    except Exception as e:
        # mejor devolver el error en desarrollo; en producción un mensaje genérico
        return Response({"message": "Ocurrió un error inesperado", "detail": str(e)},
                        status=status.HTTP_500_INTERNAL_SERVER_ERROR)


@swagger_auto_schema(
    method='post',
    operation_description="Asignación masiva de Suscripciones (múltiples por usuario)",
    tags=["Planes de Suscripcion"],
    security=[{'Bearer': []}],
    request_body=openapi.Schema(
        type=openapi.TYPE_OBJECT,
        properties={
            "planId": openapi.Schema(type=openapi.TYPE_INTEGER, description="ID del plan de suscripcion (por defecto)"),

            # defaults (opcionales si vienen en cada item)
            "status": openapi.Schema(type=openapi.TYPE_STRING, description="Estado por defecto"),
            "startDate": openapi.Schema(type=openapi.TYPE_STRING, description="Fecha inicio por defecto"),
            "endDate": openapi.Schema(type=openapi.TYPE_STRING, description="Fecha término por defecto"),
            "nextBillingDate": openapi.Schema(type=openapi.TYPE_STRING, description="Fecha próximo pago por defecto"),
            "canceledAt": openapi.Schema(type=openapi.TYPE_INTEGER, description="Fecha cancelación por defecto"),

            # lista de asignaciones (permite repetir idUsuario)
            "suscripciones": openapi.Schema(
                type=openapi.TYPE_ARRAY,
                description="Lista de suscripciones a crear. Se puede repetir idUsuario para crear múltiples suscripciones.",
                items=openapi.Schema(
                    type=openapi.TYPE_OBJECT,
                    properties={
                        "userId": openapi.Schema(type=openapi.TYPE_INTEGER, description="ID del usuario"),
                        "status": openapi.Schema(type=openapi.TYPE_STRING, description="Estado (override)"),
                        "startDate": openapi.Schema(type=openapi.TYPE_STRING, description="Fecha inicio (override)"),
                        "endDate": openapi.Schema(type=openapi.TYPE_STRING, description="Fecha término (override)"),
                        "nextBillingDate": openapi.Schema(type=openapi.TYPE_STRING, description="Fecha próximo pago (override)"),
                        "canceledAt": openapi.Schema(type=openapi.TYPE_INTEGER, description="Fecha cancelación (override)"),
                        "planId": openapi.Schema(type=openapi.TYPE_INTEGER, description="ID plan (override opcional)"),
                    },
                    required=["userId"],
                ),
            ),
        },
        required=["suscripciones"],
    ),
    responses={
        201: openapi.Response(description="Suscripciones creadas exitosamente"),
        400: openapi.Response(description="Solicitud inválida"),
    },
)
@api_view(['POST'])
@permission_classes([IsClubAdmin])
def asignarPlanesToUser(request):
    try:
        body = json.loads(request.body)

        # defaults (pueden venir o no)
        default_plan_id = body.get("planId")
        default_status = body.get("status")
        default_start_date = body.get("startDate")
        default_end_date = body.get("endDate")
        default_next_billing_date = body.get("nextBillingDate")
        default_canceled_at = body.get("canceledAt") if body.get("canceledAt") else None

        items = body.get("suscripciones", [])
        if not isinstance(items, list) or len(items) == 0:
            return Response({"message": "suscripciones debe ser una lista no vacía"}, status=status.HTTP_400_BAD_REQUEST)

        # 1) recolectar ids para traer usuarios y planes en bloque
        user_ids = [it.get("userId") for it in items if it.get("userId") is not None]
        if len(user_ids) != len(items):
            return Response({"message": "Cada item en suscripciones debe incluir idUsuario"}, status=status.HTTP_400_BAD_REQUEST)

        # planId por item puede sobrescribir al global
        plan_ids = set()
        if default_plan_id:
            plan_ids.add(default_plan_id)
        for it in items:
            if it.get("planId"):
                plan_ids.add(it.get("planId"))

        if not plan_ids:
            return Response({"message": "Debes enviar planId global o planId en cada item"}, status=status.HTTP_400_BAD_REQUEST)

        users_by_id = Usuarios.objects.in_bulk(user_ids)  # {id: Usuario}
        plans_by_id = PlanSuscripciones.objects.in_bulk(list(plan_ids))  # {id: Plan}
        print("planes", list(plans_by_id))
        # 2) construir objetos (permitiendo repetición de idUsuario)
        objs = []
        for it in items:
            user_id = it["userId"]
            user = users_by_id.get(user_id)
            if not user:
                return Response({"message": f"Usuario no encontrado: {user_id}"}, status=status.HTTP_400_BAD_REQUEST)

            plan_id = it.get("planId") or default_plan_id
            plan = plans_by_id.get(plan_id)
            if not plan:
                return Response({"message": f"Plan no encontrado: {plan_id}"}, status=status.HTTP_400_BAD_REQUEST)

            status_field = it.get("status") or default_status
            start_date = it.get("startDate") or default_start_date
            end_date = it.get("endDate") or default_end_date
            next_billing_date = it.get("nextBillingDate") or default_next_billing_date
            canceled_at = it.get("canceledAt") if it.get("canceledAt") else default_canceled_at

            # valida mínimos por suscripción
            missing = [k for k, v in {
                "status": status_field,
                "startDate": start_date,
                "endDate": end_date,
                "nextBillingDate": next_billing_date,
            }.items() if not v]
            if missing:
                return Response(
                    {"message": f"Faltan campos en suscripción de usuario {user_id}", "missing": missing},
                    status=status.HTTP_400_BAD_REQUEST
                )

            totalMeses = count_monthly_occurrences(start_date, end_date)

            objs.append(Suscripciones(
                userId=user,
                planId=plan,
                status=status_field,
                startDate=start_date,
                endDate=end_date,
                nextBillingDate=next_billing_date,
                canceledAt=canceled_at,
                totalMeses=totalMeses
            ))

        Suscripciones.objects.bulk_create(objs)

        return Response(
            {"message": "Suscripciones creadas con éxito", "created": len(objs)},
            status=status.HTTP_201_CREATED
        )

    except json.JSONDecodeError:
        return Response({"message": "JSON inválido"}, status=status.HTTP_400_BAD_REQUEST)
    except Exception as e:
        return Response({"message": "Ocurrió un error inesperado", "detail": str(e)},
                        status=status.HTTP_500_INTERNAL_SERVER_ERROR)


@swagger_auto_schema(
    method='get',
    operation_description="Obtener una suscripción de usuario",
    tags=["Planes de Suscripcion"],
    security=[{'Bearer': []}],
    responses={
        200: openapi.Response(
            description="Suscripción encontrada con éxito"
        ),
        500: openapi.Response(description="Ocurrio un error inesperado"),
    },
)
@api_view(['GET'])
@permission_classes([IsAuthenticated])
def getSuscripcionByUser(request, userId):
    # Solo el propio usuario o el staff del club pueden ver la suscripción
    if not is_self_or_staff(request.user, userId):
        return Response({"message": "No tienes permisos para ver esta suscripción"}, status=status.HTTP_403_FORBIDDEN)
    try:
        # Traer la suscripción junto con plan y usuario relacionados en la misma query
        suscripcion = Suscripciones.objects.select_related('planId', 'userId').get(userId__id=userId)

        def scalar(val):
            if val is None:
                return None
            return getattr(val, "id", val)

        # Preparar datos del plan si existe
        plan = suscripcion.planId
        plan_data = None
        if plan is not None:
            plan_data = {
                "id": plan.id,
                "name": plan.name,
                "description": plan.description,
                "price": plan.price,
                "interval": plan.interval,
                "intervalCount": plan.intervalCount,
                "active": plan.active,
                "createdAt": plan.createdAt.isoformat() if plan.createdAt else None
            }

        # (Opcional) info mínima del usuario para conveniencia
        user = suscripcion.userId
        user_data = None
        if user is not None:
            user_data = {
                "id": user.id,
                # "username": getattr(user, "username", None)  # descomenta si quieres exponer username
            }

        return Response({
            "message": "Suscripción encontrada con éxito",
            "suscripcion": {
                "id": suscripcion.id,
                "userId": scalar(user),
                "user": user_data,
                "planId": scalar(plan),
                "plan": plan_data,  # aquí está la info completa del plan
                "status": suscripcion.status,
                "startDate": suscripcion.startDate.isoformat() if suscripcion.startDate else None,
                "endDate": suscripcion.endDate.isoformat() if suscripcion.endDate else None,
                "nextBillingDate": suscripcion.nextBillingDate.isoformat() if suscripcion.nextBillingDate else None,
                "canceledAt": suscripcion.canceledAt.isoformat() if suscripcion.canceledAt else None,
                "createdAt": suscripcion.createdAt.isoformat() if suscripcion.createdAt else None,
                "totalMeses": suscripcion.totalMeses,
                "mesesPagados": suscripcion.mesesPagados
            }
        }, status=status.HTTP_200_OK)
    except Suscripciones.DoesNotExist:
        return Response({"message": f"Suscripción del usuario con id => {userId} no encontrada"},
                        status=status.HTTP_200_OK)
    except json.JSONDecodeError:
        return Response({"message": "JSON inválido"}, status=status.HTTP_400_BAD_REQUEST)
    except Exception as e:
        # mejor devolver el error en desarrollo; en producción un mensaje genérico
        return Response({"message": "Ocurrió un error inesperado", "detail": str(e)},
                        status=status.HTTP_500_INTERNAL_SERVER_ERROR)


@swagger_auto_schema(
    method='post',
    operation_description="Agregar un nuevo pago",
    tags=["Pagos"],
    security=[{'Bearer': []}],
    request_body=openapi.Schema(
        type=openapi.TYPE_OBJECT,
        properties={
            "suscriptionId": openapi.Schema(type=openapi.TYPE_INTEGER, description="Id de la suscrupción"),
            "monto": openapi.Schema(type=openapi.TYPE_INTEGER, description="Monto del pago"),
            "moneda": openapi.Schema(type=openapi.TYPE_INTEGER, description="Moneda del pago"),
            "status": openapi.Schema(type=openapi.TYPE_INTEGER, description="Estado del pago"),
            "fechaPago": openapi.Schema(type=openapi.TYPE_STRING, description="Fecha de pago del pago"),
            "transactionId": openapi.Schema(type=openapi.TYPE_INTEGER, description="ID de Transacción del pago"),
            "notas": openapi.Schema(type=openapi.TYPE_STRING, description="Notas del pago"),
        },
        required=["suscriptionId", "monto", "moneda", "status", "fechaPago", "transactionId"],
    ),
    responses={
        201: openapi.Response(description="Pago creado con éxito"),
        500: openapi.Response(description="Ocurrió un error inesperado"),
    },
)
@api_view(['POST'])
@permission_classes([IsClubAdmin])
def addPayment(request):
    try:
        body = json.loads(request.body)

        suscriptionId = body.get("suscriptionId")
        monto = body.get("monto")
        moneda = body.get("moneda")
        estado = body.get("status")
        fechaPago = body.get("fechaPago")
        transactionId = body.get("transactionId")
        notas = body.get("notas")

        if not all([suscriptionId, monto, moneda, estado, fechaPago, transactionId]):
            return Response({"message": "Todos los campos son obligatorios"}, status=status.HTTP_400_BAD_REQUEST)

        try:
            suscripcion = Suscripciones.objects.get(pk=suscriptionId)
            pago = Pago.objects.create(
                suscriptionId=suscripcion,
                monto=monto,
                moneda=moneda,
                status=estado,
                fechaPago=fechaPago,
                transactionId=transactionId,
                notas=notas
            )
        except Exception as error:
            return Response({"error": f"Error inesperado: {str(error)}"}, status=status.HTTP_500_INTERNAL_SERVER_ERROR)

        return Response({
            "message": "Pago ingresado con éxito",
            "pago": {
                "id": pago.id,
                "suscriptionId": pago.suscriptionId_id,
                "monto": pago.monto,
                "moneda": pago.moneda,
                "status": pago.status,
                "fechaPago": pago.fechaPago,
                "transactionId": pago.transactionId,
                "notas": pago.notas
            }
        })


    except json.JSONDecodeError as error:
        return Response({"message": "Ocurrio un error inesperado"}, status=status.HTTP_500_INTERNAL_SERVER_ERROR)


@swagger_auto_schema(
    method='put',
    operation_description="Actualizar un pago por ID de transacción",
    tags=["Pagos"],
    security=[{'Bearer': []}],
    request_body=openapi.Schema(
        type=openapi.TYPE_OBJECT,
        properties={
            "monto": openapi.Schema(type=openapi.TYPE_INTEGER, description="Monto del pago"),
            "moneda": openapi.Schema(type=openapi.TYPE_STRING, description="Tipo moneda del pago"),
            "status": openapi.Schema(type=openapi.TYPE_STRING, description="Estado del pago"),
            "fechaPago": openapi.Schema(type=openapi.TYPE_STRING, description="Fecha de pago del pago"),
            "suscriptionId": openapi.Schema(type=openapi.TYPE_INTEGER, description="ID de suscripción del pago"),
            "notas": openapi.Schema(type=openapi.TYPE_STRING, description="Notas del pago"),
            "mesesPagados": openapi.Schema(type=openapi.TYPE_INTEGER, description="Meses pagados")
        },
    ),
    responses={
        200: openapi.Response(description="Pago actualizado con éxito"),
        404: openapi.Response(description="Pago no encontrado"),
    },
)
@api_view(['PUT'])
@permission_classes([IsClubAdmin])
def editPayment(request, id):
    try:
        payment = Pago.objects.get(transactionId=id)
        body = json.loads(request.body)

        if "monto" in body:
            payment.monto = body["monto"]
        if "moneda" in body:
            payment.moneda = body["moneda"]
        if "status" in body:
            payment.status = body["status"]
        if "fechaPago" in body:
            payment.fechaPago = body["fechaPago"]
        if "suscriptionId" in body:
            payment.suscriptionId = Suscripciones.objects.get(pk=body["suscriptionId"])
        if "notas" in body:
            payment.notas = body["notas"]


        suscripcion = Suscripciones.objects.get(pk=payment.suscriptionId_id)

        if "mesesPagados" in body:
            suscripcion.mesesPagados = body["mesesPagados"]
        suscripcion.save()
        payment.save()





        return Response(
            {
                "message": "Pago actualizado con éxito",
                "pago": {
                "id": payment.id,
                "suscriptionId": payment.suscriptionId_id,
                "monto": payment.monto,
                "moneda": payment.moneda,
                "status": payment.status,
                "fechaPago": payment.fechaPago,
                "transactionId": payment.transactionId,
                "notas": payment.notas
            }
            },
            status=200,
        )
    except Pago.DoesNotExist:
        return Response({"error": "Pago no encontrado"}, status=404)