from django.shortcuts import render
from rest_framework import viewsets
from rest_framework.decorators import action
from rest_framework.response import Response
from Models.Provincia import Provincia
from Models.Localidad import Localidad

from rest_framework import status
from drf_yasg.utils import swagger_auto_schema
from drf_yasg import openapi

from .serializers import ProvinciaSerializer
from localidad.serializers import LocalidadSerializer

class ProvinciaViewSet(viewsets.ViewSet):
    @action(detail=False, methods=['get'], url_path='list_province')
    def list_province(self, request):
        provincias = Provincia.objects.all()
        serializer = ProvinciaSerializer(provincias, many=True)
        return Response(serializer.data)

    @swagger_auto_schema(
        operation_description="Devuelve una provincia por su ID.",
        request_body=openapi.Schema(
            type=openapi.TYPE_OBJECT,
            properties={
                'id': openapi.Schema(type=openapi.TYPE_INTEGER, description='ID de la provincia')
            },
            required=['id']
        ),
        responses={
            200: openapi.Response('Provincia', ProvinciaSerializer),
            400: 'Solicitud incorrecta',
            404: 'Provincia no encontrada'
        }
    )
    @action(detail=False, methods=['post'], url_path='get_province_by_id')
    def get_province_by_id(self, request):
        provincia_id = request.data.get('id')
        if not provincia_id:
            return Response({"error": "Se requiere el id de la provincia"}, status=status.HTTP_400_BAD_REQUEST)
        try:
            provincia = Provincia.objects.get(id=provincia_id)
        except Provincia.DoesNotExist:
            return Response({"error": "Provincia no encontrada"}, status=status.HTTP_404_NOT_FOUND)
        serializer = ProvinciaSerializer(provincia)
        return Response(serializer.data)

    @swagger_auto_schema(
        operation_description="Get all localities for a given province ID.",
        request_body=openapi.Schema(
            type=openapi.TYPE_OBJECT,
            properties={
                'province_id': openapi.Schema(type=openapi.TYPE_INTEGER, description='ID of the province')
            },
            required=['province_id']
        ),
        responses={
            200: openapi.Response('Localities with province name'),
            400: 'Bad request',
            404: 'Province not found'
        }
    )
    @action(detail=False, methods=['post'], url_path='get_localities_by_id')
    def get_localities_by_id(self, request):
        province_id = request.data.get('province_id')
        if not province_id:
            return Response({"error": "Se requiere el id de la provincia"}, status=status.HTTP_400_BAD_REQUEST)
        try:
            provincia = Provincia.objects.get(id=province_id)
            nombre_provincia = provincia.nombre
        except Provincia.DoesNotExist:
            return Response({"error": "Provincia no encontrada"}, status=status.HTTP_404_NOT_FOUND)

        localidades = Localidad.objects.filter(provincia_id=province_id).values('id', 'nombre', 'codigo_postal')
        return Response({
            "nombre_provincia": nombre_provincia,
            "localidades": list(localidades)
        })
