from django.shortcuts import render
from rest_framework import viewsets, status
from rest_framework.decorators import action
from rest_framework.response import Response
from drf_yasg.utils import swagger_auto_schema
from drf_yasg import openapi

# Importaciones de modelos
from Models.Empresa import Empresa
from Models.contacto_model import Contacto
from Models.oportunidad_de_venta_model import OportunidadDeVenta
from datetime import datetime, timedelta
from django.db.models import Count, Q


class MetricsViewSet(viewsets.ViewSet):
    """
    ViewSet para métricas y estadísticas del dashboard
    """

    @swagger_auto_schema(
        operation_description="Devuelve métricas generales del sistema.",
        responses={
            200: openapi.Response('Métricas generales')
        }
    )
    @action(detail=False, methods=['get'], url_path='general')
    def general_metrics(self, request):
        """
        Devuelve métricas generales del sistema como:
        - Total empresas tipo 1
        - Datos nuevos (último mes)
        - Total empresas tipo 2
        - Clientes nuevos (último mes)
        - Total de oportunidades de venta
        - Oportunidades nuevas (último mes)
        """
        # Fechas para filtrar
        today = datetime.now().date()
        first_day_of_month = datetime(today.year, today.month, 1).date()
        
        # Métricas de empresas
        total_datos = Empresa.objects.filter(deleted_at__isnull=True, tipo_empresa=1).count()
        nuevos_datos = Empresa.objects.filter(
            deleted_at__isnull=True,
            tipo_empresa=1,
            fecha_creacion__gte=first_day_of_month
        ).count()
        
        # Métricas de datos
        # Métricas de datos (empresas tipo 1)
        total_clientes = Empresa.objects.filter(deleted_at__isnull=True, tipo_empresa=2).count()
        nuevos_clientes = Empresa.objects.filter(
            deleted_at__isnull=True,
            tipo_empresa=2,
            fecha_creacion__gte=first_day_of_month
        ).count()
        
        # Clientes activos (estado_empresa=1)
        # Asumiendo que estado_empresa 1 es "Activo"
        clientes_activos = Empresa.objects.filter(
            deleted_at__isnull=True,
            tipo_empresa=2,
            estado_empresa_id=1
        ).count()

        # Métricas de oportunidades de venta
        total_oportunidades = OportunidadDeVenta.objects.filter(deleted_at__isnull=True).count()
        nuevas_oportunidades = OportunidadDeVenta.objects.filter(
            deleted_at__isnull=True,
            fecha_creacion__gte=first_day_of_month
        ).count()

        return Response({
            "Datos": {
                "total": total_datos,
                "nuevas_este_mes": nuevos_datos,
            },
            "Clientes": {
                "total": total_clientes,
                "nuevos_este_mes": nuevos_clientes,
                "activos": clientes_activos
            },
            "Oportunidades_de_venta": {
                "total": total_oportunidades,
                "nuevas_este_mes": nuevas_oportunidades,
            }
        })
    
    @swagger_auto_schema(
        operation_description="Devuelve métricas por provincia.",
        responses={
            200: openapi.Response('Métricas por provincia')
        }
    )
    @action(detail=False, methods=['get'], url_path='by-province')
    def metrics_by_province(self, request):
        """
        Devuelve la cantidad de empresas por provincia
        """
        # Agrupar empresas por provincia
        empresas_por_provincia = Empresa.objects.filter(
            deleted_at__isnull=True
        ).values('provincia__nombre').annotate(
            total=Count('id')
        ).order_by('-total')
        
        return Response({
            "empresas_por_provincia": list(empresas_por_provincia)
        })
        
    @swagger_auto_schema(
        operation_description="Devuelve métricas de actividad reciente.",
        responses={
            200: openapi.Response('Métricas de actividad')
        }
    )
    @action(detail=False, methods=['get'], url_path='activity')
    def activity_metrics(self, request):
        """
        Devuelve métricas de actividad:
        - Empresas creadas por día (últimos 7 días)
        - Contactos creados por día (últimos 7 días)
        """
        # Fechas para filtrar
        today = datetime.now().date()
        days_ago_7 = today - timedelta(days=6)  # Para obtener 7 días incluyendo hoy
        
        # Preparar días para la respuesta
        days = [(days_ago_7 + timedelta(days=i)).strftime('%Y-%m-%d') for i in range(7)]
        
        # Empresas por día
        empresas_por_dia = {}
        for day in days:
            date_obj = datetime.strptime(day, '%Y-%m-%d').date()
            count = Empresa.objects.filter(
                deleted_at__isnull=True,
                fecha_creacion__date=date_obj
            ).count()
            empresas_por_dia[day] = count
            
        # Contactos por día
        contactos_por_dia = {}
        for day in days:
            date_obj = datetime.strptime(day, '%Y-%m-%d').date()
            count = Contacto.objects.filter(
                deleted_at__isnull=True,
                fecha_creacion__date=date_obj
            ).count()
            contactos_por_dia[day] = count
        
        return Response({
            "fechas": days,
            "empresas_por_dia": empresas_por_dia,
            "contactos_por_dia": contactos_por_dia
        })