from rest_framework import permissions, status
from rest_framework.response import Response
from rest_framework.views import APIView
from django.shortcuts import get_object_or_404

from apps.users.models import User
from .models import MorningEfficiencyLog
from .services import (
    get_user_action_points,
    generate_ai_efficiency_insight,
    build_beautiful_morning_email_html,
    send_morning_efficiency_email,
    run_morning_efficiency_agent,
)


class MorningEfficiencyPreviewView(APIView):
    """
    Preview the generated morning action point briefing and beautiful HTML email
    for the current user or a specified target user.
    """
    permission_classes = [permissions.IsAuthenticated]

    def get(self, request):
        user_id = request.query_params.get("user_id")
        if user_id:
            user = get_object_or_404(User, id=user_id)
        else:
            user = request.user

        summary_data = get_user_action_points(user)
        ai_insight = generate_ai_efficiency_insight(user, summary_data)
        html_body = build_beautiful_morning_email_html(user, summary_data, ai_insight)

        return Response({
            "ok": True,
            "user_id": user.id,
            "user_email": user.email,
            "role": user.role,
            "action_point_count": len(summary_data["action_items"]),
            "interviews_today_count": len(summary_data["interviews_today"]),
            "pending_approvals_count": len(summary_data["pending_approvals"]),
            "ai_insight": ai_insight,
            "summary_data": summary_data,
            "generated_html": html_body,
        })


class MorningEfficiencyTriggerView(APIView):
    """
    Trigger the Morning Efficiency Agent to dispatch action point emails to recruiters,
    hiring managers, project managers, or all users.
    """
    permission_classes = [permissions.IsAuthenticated]

    def post(self, request):
        target_roles = request.data.get("roles")  # e.g., ["RECRUITER", "ADMIN", "INTERVIEWER"]
        target_user_ids = request.data.get("user_ids")  # optional list of specific user IDs
        dry_run = request.data.get("dry_run", False)

        if target_user_ids:
            users = User.objects.filter(id__in=target_user_ids, is_active=True)
            results = [send_morning_efficiency_email(u, dry_run=dry_run) for u in users]
        else:
            results = run_morning_efficiency_agent(target_roles=target_roles, dry_run=dry_run)

        successful = [r for r in results if r.get("ok")]
        
        return Response({
            "ok": True,
            "message": f"Morning Efficiency Agent executed for {len(results)} recipient(s).",
            "total_processed": len(results),
            "successful_count": len(successful),
            "dry_run": dry_run,
            "results": results,
        }, status=status.HTTP_200_OK)


class MorningEfficiencyLogListView(APIView):
    """
    List historical logs of Morning Efficiency Agent email executions with pagination.
    """
    permission_classes = [permissions.IsAuthenticated]

    def get(self, request):
        try:
            page = max(1, int(request.query_params.get("page", 1)))
        except (ValueError, TypeError):
            page = 1

        try:
            page_size = max(1, min(100, int(request.query_params.get("page_size", 10))))
        except (ValueError, TypeError):
            page_size = 10

        qs = MorningEfficiencyLog.objects.all()
        total_count = qs.count()
        total_pages = max(1, (total_count + page_size - 1) // page_size) if total_count > 0 else 1

        if page > total_pages:
            page = total_pages

        start = (page - 1) * page_size
        end = start + page_size
        logs = qs[start:end]

        data = []
        for log in logs:
            data.append({
                "id": log.id,
                "user_id": log.user_id,
                "role": log.role,
                "email_sent_to": log.email_sent_to,
                "subject": log.subject,
                "action_point_count": log.action_point_count,
                "interviews_today_count": log.interviews_today_count,
                "pending_approvals_count": log.pending_approvals_count,
                "email_status": log.email_status,
                "ai_insight": log.ai_insight,
                "generated_html": log.generated_html,
                "error_message": log.error_message,
                "created_at": log.created_at.isoformat(),
            })

        return Response({
            "ok": True,
            "logs": data,
            "total_count": total_count,
            "total_pages": total_pages,
            "current_page": page,
            "page_size": page_size,
        })
