# -*- coding: utf-8 -*-
"""
Campaigns App Views

This module contains views for campaign management functionality.
"""

from django.shortcuts import render, get_object_or_404
from django.contrib.auth.decorators import login_required
from django.contrib.auth.mixins import LoginRequiredMixin, PermissionRequiredMixin
from django.views.generic import ListView, DetailView, CreateView, UpdateView, DeleteView
from django.urls import reverse_lazy
from django.contrib import messages
from django.db.models import Q, Count, Sum, Avg
from django.http import JsonResponse
from rest_framework import viewsets, status, permissions
from rest_framework.decorators import action
from rest_framework.response import Response
from rest_framework.filters import SearchFilter, OrderingFilter
from django_filters.rest_framework import DjangoFilterBackend

from .models import Campaign
from .serializers import CampaignSerializer


@login_required
def campaign_dashboard(request):
    """
    Campaign dashboard view showing overview and statistics.
    """
    campaigns = Campaign.objects.filter(advertiser__agency__users=request.user)
    
    context = {
        'total_campaigns': campaigns.count(),
        'active_campaigns': campaigns.filter(status='active').count(),
        'paused_campaigns': campaigns.filter(status='paused').count(),
        'completed_campaigns': campaigns.filter(status='completed').count(),
        'recent_campaigns': campaigns.order_by('-created_at')[:5],
    }
    
    return render(request, 'campaigns/dashboard.html', context)


class CampaignListView(LoginRequiredMixin, ListView):
    """
    List view for campaigns.
    """
    model = Campaign
    template_name = 'campaigns/campaign_list.html'
    context_object_name = 'campaigns'
    paginate_by = 20
    
    def get_queryset(self):
        queryset = Campaign.objects.filter(
            advertiser__agency__users=self.request.user
        ).select_related('advertiser', 'advertiser__agency')
        
        search = self.request.GET.get('search')
        if search:
            queryset = queryset.filter(
                Q(name__icontains=search) |
                Q(description__icontains=search) |
                Q(advertiser__name__icontains=search)
            )
        
        status_filter = self.request.GET.get('status')
        if status_filter:
            queryset = queryset.filter(status=status_filter)
        
        return queryset.order_by('-created_at')


class CampaignDetailView(LoginRequiredMixin, DetailView):
    """
    Detail view for a single campaign.
    """
    model = Campaign
    template_name = 'campaigns/campaign_detail.html'
    context_object_name = 'campaign'
    
    def get_queryset(self):
        return Campaign.objects.filter(
            advertiser__agency__users=self.request.user
        ).select_related('advertiser', 'advertiser__agency')


class CampaignCreateView(LoginRequiredMixin, PermissionRequiredMixin, CreateView):
    """
    Create view for campaigns.
    """
    model = Campaign
    template_name = 'campaigns/campaign_form.html'
    fields = ['name', 'description', 'advertiser', 'budget', 'start_date', 'end_date', 'status']
    permission_required = 'campaigns.add_campaign'
    
    def get_success_url(self):
        return reverse_lazy('campaigns:detail', kwargs={'pk': self.object.pk})
    
    def form_valid(self, form):
        messages.success(self.request, 'Campaign created successfully!')
        return super().form_valid(form)


class CampaignUpdateView(LoginRequiredMixin, PermissionRequiredMixin, UpdateView):
    """
    Update view for campaigns.
    """
    model = Campaign
    template_name = 'campaigns/campaign_form.html'
    fields = ['name', 'description', 'budget', 'start_date', 'end_date', 'status']
    permission_required = 'campaigns.change_campaign'
    
    def get_queryset(self):
        return Campaign.objects.filter(
            advertiser__agency__users=self.request.user
        )
    
    def get_success_url(self):
        return reverse_lazy('campaigns:detail', kwargs={'pk': self.object.pk})
    
    def form_valid(self, form):
        messages.success(self.request, 'Campaign updated successfully!')
        return super().form_valid(form)


class CampaignDeleteView(LoginRequiredMixin, PermissionRequiredMixin, DeleteView):
    """
    Delete view for campaigns.
    """
    model = Campaign
    template_name = 'campaigns/campaign_confirm_delete.html'
    permission_required = 'campaigns.delete_campaign'
    success_url = reverse_lazy('campaigns:list')
    
    def get_queryset(self):
        return Campaign.objects.filter(
            advertiser__agency__users=self.request.user
        )
    
    def delete(self, request, *args, **kwargs):
        messages.success(request, 'Campaign deleted successfully!')
        return super().delete(request, *args, **kwargs)


# API Views
class CampaignViewSet(viewsets.ModelViewSet):
    """
    ViewSet for Campaign API endpoints.
    """
    serializer_class = CampaignSerializer
    permission_classes = [permissions.IsAuthenticated]
    filter_backends = [DjangoFilterBackend, SearchFilter, OrderingFilter]
    filterset_fields = ['status', 'advertiser', 'start_date', 'end_date']
    search_fields = ['name', 'description', 'advertiser__name']
    ordering_fields = ['name', 'created_at', 'start_date', 'end_date', 'budget']
    ordering = ['-created_at']
    
    def get_queryset(self):
        return Campaign.objects.filter(
            advertiser__agency__users=self.request.user
        ).select_related('advertiser', 'advertiser__agency')
    
    @action(detail=True, methods=['post'])
    def activate(self, request, pk=None):
        """
        Activate a campaign.
        """
        campaign = self.get_object()
        campaign.status = 'active'
        campaign.save()
        return Response({'status': 'Campaign activated'})
    
    @action(detail=True, methods=['post'])
    def pause(self, request, pk=None):
        """
        Pause a campaign.
        """
        campaign = self.get_object()
        campaign.status = 'paused'
        campaign.save()
        return Response({'status': 'Campaign paused'})
    
    @action(detail=True, methods=['post'])
    def complete(self, request, pk=None):
        """
        Mark a campaign as completed.
        """
        campaign = self.get_object()
        campaign.status = 'completed'
        campaign.save()
        return Response({'status': 'Campaign completed'})
    
    @action(detail=False, methods=['get'])
    def statistics(self, request):
        """
        Get campaign statistics.
        """
        campaigns = self.get_queryset()
        
        stats = {
            'total_campaigns': campaigns.count(),
            'active_campaigns': campaigns.filter(status='active').count(),
            'paused_campaigns': campaigns.filter(status='paused').count(),
            'completed_campaigns': campaigns.filter(status='completed').count(),
            'total_budget': campaigns.aggregate(Sum('budget'))['budget__sum'] or 0,
            'average_budget': campaigns.aggregate(Avg('budget'))['budget__avg'] or 0,
        }
        
        return Response(stats)


@login_required
def campaign_analytics(request, pk):
    """
    Campaign analytics view with performance metrics.
    """
    campaign = get_object_or_404(
        Campaign.objects.filter(advertiser__agency__users=request.user),
        pk=pk
    )
    
    # This would include actual analytics data
    # For now, returning mock data structure
    analytics_data = {
        'impressions': 0,
        'clicks': 0,
        'conversions': 0,
        'spend': 0,
        'ctr': 0,
        'cpc': 0,
        'conversion_rate': 0,
    }
    
    context = {
        'campaign': campaign,
        'analytics': analytics_data,
    }
    
    return render(request, 'campaigns/campaign_analytics.html', context)