from django.shortcuts import render, redirect, get_object_or_404
from django.views.generic import TemplateView
from django.contrib.auth.mixins import LoginRequiredMixin
from django.contrib.auth.decorators import login_required
from django.contrib import messages
from accounts.permissions import DepartmentRequiredMixin, permission_required
from tickets.models import Ticket
from .models import Customer, MarketingWeeklyReport, MarketingLeadInteraction
from .forms import MarketingWeeklyReportForm, MarketingReportFilterForm, MarketingReportReviewForm
from django.db.models import Count, Q
from django.utils import timezone
from datetime import timedelta

class MarketingDashboardView(LoginRequiredMixin, TemplateView):
    template_name = 'customers/marketing_dashboard.html'

    def dispatch(self, request, *args, **kwargs):
        if not request.user.is_authenticated:
            return self.handle_no_permission()

        # Check if user has marketing permissions
        from accounts.permissions import has_permission

        user_dept = None
        if hasattr(request.user, 'employee_profile') and request.user.employee_profile and request.user.employee_profile.department:
            user_dept = request.user.employee_profile.department.name

        if not (request.user.is_superuser or 
                request.user.is_staff or
                has_permission(request.user, 'view_marketingweeklyreport') or
                user_dept in ['Marketing', 'Management', 'Staff']):
            messages.error(request, 'Access denied. You need marketing permissions.')
            return redirect('dashboard')

        return super().dispatch(request, *args, **kwargs)

    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)

        # Get current month data
        now = timezone.now()
        month_start = now.replace(day=1, hour=0, minute=0, second=0, microsecond=0)
        
        # Get marketing reports data
        my_reports = MarketingWeeklyReport.objects.filter(marketing_staff=self.request.user)
        my_reports_this_month = my_reports.filter(created_at__gte=month_start)
        
        # Calculate conversion rate from recent reports
        recent_reports = my_reports.filter(created_at__gte=month_start - timedelta(days=90))
        total_leads = sum(r.new_leads_generated for r in recent_reports)
        total_conversions = sum(r.leads_converted for r in recent_reports)
        conversion_rate = (total_conversions / total_leads * 100) if total_leads > 0 else 0

        # Customers added this month by this user
        my_customers_this_month = Customer.objects.filter(
            created_at__gte=month_start,
            # You might want to track who added the customer
        ).order_by('-created_at')

        # All customers added this month
        all_customers_this_month = Customer.objects.filter(
            created_at__gte=month_start
        ).order_by('-created_at')

        # Tickets created by marketing this month
        my_tickets_this_month = Ticket.objects.filter(
            created_by=self.request.user,
            created_at__gte=month_start
        ).order_by('-created_at')

        # Statistics
        total_customers = Customer.objects.count()
        customers_this_month = all_customers_this_month.count()
        my_customers_count = my_customers_this_month.count()
        my_tickets_count = my_tickets_this_month.count()

        # Customer growth by week
        weekly_growth = []
        for i in range(4):
            week_start = month_start + timedelta(weeks=i)
            week_end = week_start + timedelta(weeks=1)
            if week_end > now:
                week_end = now

            week_customers = Customer.objects.filter(
                created_at__range=[week_start, week_end]
            ).count()

            weekly_growth.append({
                'week': f"Week {i+1}",
                'count': week_customers,
                'start_date': week_start.strftime('%b %d'),
                'end_date': week_end.strftime('%b %d')
            })

        # Recent activity
        recent_customers = all_customers_this_month[:10]
        recent_tickets = my_tickets_this_month[:10]

        context.update({
            'total_customers': total_customers,
            'customers_this_month': customers_this_month,
            'my_customers_count': my_customers_count,
            'my_tickets_count': my_tickets_count,
            'my_customers_this_month': my_customers_this_month[:5],
            'recent_customers': recent_customers,
            'recent_tickets': recent_tickets,
            'weekly_growth': weekly_growth,
            'current_month': now.strftime('%B %Y'),
            'my_reports_count': my_reports.count(),
            'reports_this_month': my_reports_this_month.count(),
            'conversion_rate': conversion_rate,
            'total_reports': my_reports.count(),
            'pending_reports': my_reports.filter(status='draft').count(),
            'monthly_leads': sum(r.new_leads_generated for r in my_reports_this_month),
        })

        return context

@login_required
def marketing_quick_add_customer(request):
    """Quick add customer form for marketing"""
    from .forms import CustomerForm
    from django.shortcuts import redirect
    from django.contrib import messages

    if request.method == 'POST':
        form = CustomerForm(request.POST)
        if form.is_valid():
            customer = form.save()
            messages.success(request, f'Customer {customer.full_name} has been created successfully!')
            return redirect('customers:marketing_dashboard')
    else:
        form = CustomerForm()



@login_required
def marketing_report_create(request):
    """Create new marketing weekly report"""
    from accounts.permissions import has_permission

    # Allow marketing staff, management, admin, staff, and superusers
    if not (request.user.is_superuser or 
            request.user.is_staff or
            has_permission(request.user, 'add_marketingweeklyreport') or
            (hasattr(request.user, 'employee_profile') and 
             request.user.employee_profile and 
             request.user.employee_profile.department and 
             request.user.employee_profile.department.name in ['Marketing', 'Management', 'Staff'])):
        messages.error(request, 'Access denied. You need marketing permissions to create reports.')
        return redirect('dashboard')

    # Check if report already exists for current week
    today = timezone.now().date()
    monday = today - timedelta(days=today.weekday())

    existing_report = MarketingWeeklyReport.objects.filter(
        marketing_staff=request.user,
        week_starting=monday
    ).first()

    if existing_report:
        messages.info(request, 'You already have a report for this week. Editing existing report.')
        return redirect('customers:marketing_report_edit', pk=existing_report.pk)

    if request.method == 'POST':
        form = MarketingWeeklyReportForm(request.POST)
        if form.is_valid():
            report = form.save(commit=False)
            report.marketing_staff = request.user
            report.save()
            messages.success(request, 'Marketing report created successfully!')
            return redirect('customers:marketing_report_detail', pk=report.pk)
    else:
        form = MarketingWeeklyReportForm()

    return render(request, 'customers/marketing_report_form.html', {
        'form': form,
        'title': 'Create Weekly Marketing Report'
    })


@login_required
def marketing_report_list(request):
    """List all marketing reports with filtering"""
    from .models import MarketingWeeklyReport
    from accounts.permissions import has_permission

    # Check if user has basic marketing view permissions
    user_dept = None
    if hasattr(request.user, 'employee_profile') and request.user.employee_profile and request.user.employee_profile.department:
        user_dept = request.user.employee_profile.department.name

    if not (request.user.is_superuser or 
            request.user.is_staff or
            has_permission(request.user, 'view_marketingweeklyreport') or
            user_dept in ['Marketing', 'Management', 'Staff']):
        messages.error(request, 'Access denied. You need marketing permissions to view reports.')
        return redirect('dashboard')

    # Base queryset based on user permissions
    
    if user_dept == 'Marketing':
        # Marketing staff see only their reports
        reports = MarketingWeeklyReport.objects.filter(marketing_staff=request.user)
    elif (request.user.is_superuser or 
          request.user.is_staff or
          user_dept in ['Management', 'Staff']):
        # Management, staff, and superusers see all reports
        reports = MarketingWeeklyReport.objects.all()
    else:
        # Other users see no reports
        reports = MarketingWeeklyReport.objects.none()

    # Apply filters
    filter_form = MarketingReportFilterForm(request.GET)
    if filter_form.is_valid():
        if filter_form.cleaned_data.get('staff_member'):
            reports = reports.filter(marketing_staff=filter_form.cleaned_data['staff_member'])
        if filter_form.cleaned_data.get('date_from'):
            reports = reports.filter(week_starting__gte=filter_form.cleaned_data['date_from'])
        if filter_form.cleaned_data.get('date_to'):
            reports = reports.filter(week_ending__lte=filter_form.cleaned_data['date_to'])
        if filter_form.cleaned_data.get('status'):
            reports = reports.filter(status=filter_form.cleaned_data['status'])

    reports = reports.order_by('-week_starting', 'marketing_staff__first_name')

    # Pagination
    from django.core.paginator import Paginator
    paginator = Paginator(reports, 20)
    page_number = request.GET.get('page')
    page_obj = paginator.get_page(page_number)

    return render(request, 'customers/marketing_report_list.html', {
        'page_obj': page_obj,
        'filter_form': filter_form,
        'title': 'Marketing Weekly Reports'
    })


@login_required
def marketing_report_detail(request, pk):
    """View marketing report details"""
    from .models import MarketingWeeklyReport
    from accounts.permissions import has_permission

    # Check if user has basic marketing view permissions
    user_dept = None
    if hasattr(request.user, 'employee_profile') and request.user.employee_profile and request.user.employee_profile.department:
        user_dept = request.user.employee_profile.department.name

    if not (request.user.is_superuser or 
            request.user.is_staff or
            has_permission(request.user, 'view_marketingweeklyreport') or
            user_dept in ['Marketing', 'Management', 'Staff']):
        messages.error(request, 'Access denied. You need marketing permissions to view reports.')
        return redirect('dashboard')

    report = get_object_or_404(MarketingWeeklyReport, pk=pk)

    # Check permissions
    

    if user_dept == 'Marketing' and report.marketing_staff != request.user:
        messages.error(request, 'You can only view your own reports.')
        return redirect('customers:marketing_report_list')

    # Get lead interactions for this report
    interactions = report.lead_interactions.all()

    context = {
        'report': report,
        'interactions': interactions,
        'can_edit': request.user == report.marketing_staff and report.status == 'draft',
        'can_review': request.user.role in ['management', 'admin', 'staff'] and report.status == 'submitted',
    }

    return render(request, 'customers/marketing_report_detail.html', context)


@login_required
def marketing_report_edit(request, pk):
    """Edit marketing report"""
    from .models import MarketingWeeklyReport

    report = get_object_or_404(MarketingWeeklyReport, pk=pk)

    # Check permissions
    if request.user != report.marketing_staff:
        messages.error(request, 'You can only edit your own reports.')
        return redirect('customers:marketing_report_list')

    if report.status != 'draft':
        messages.error(request, 'You can only edit reports in draft status.')
        return redirect('customers:marketing_report_detail', pk=pk)

    if request.method == 'POST':
        form = MarketingWeeklyReportForm(request.POST, instance=report)
        if form.is_valid():
            form.save()
            messages.success(request, 'Report updated successfully!')
            return redirect('customers:marketing_report_detail', pk=report.pk)
    else:
        form = MarketingWeeklyReportForm(instance=report)

    return render(request, 'customers/marketing_report_form.html', {
        'form': form,
        'report': report,
        'title': f'Edit Marketing Report - Week of {report.week_starting}'
    })


@login_required
def marketing_report_submit(request, pk):
    """Submit marketing report for review"""
    from .models import MarketingWeeklyReport

    report = get_object_or_404(MarketingWeeklyReport, pk=pk)

    if request.user != report.marketing_staff:
        messages.error(request, 'Access denied.')
        return redirect('customers:marketing_report_list')

    if report.status != 'draft':
        messages.error(request, 'Report can only be submitted when in draft status.')
        return redirect('customers:marketing_report_detail', pk=pk)

    if request.method == 'POST':
        report.status = 'submitted'
        report.save()
        messages.success(request, 'Report submitted for management review!')

        # Send notification to management (if notification system exists)
        try:
            from notifications.services import NotificationService
            NotificationService.notify_marketing_report_submitted(report)
        except ImportError:
            pass

        return redirect('customers:marketing_report_detail', pk=pk)

    return render(request, 'customers/marketing_report_submit_confirm.html', {'report': report})


@login_required
def marketing_report_review(request, pk):
    """Management review of marketing report"""
    from .models import MarketingWeeklyReport
    from accounts.permissions import has_permission

    # Check if user has management permissions to review reports
    user_dept = None
    if hasattr(request.user, 'employee_profile') and request.user.employee_profile and request.user.employee_profile.department:
        user_dept = request.user.employee_profile.department.name

    if not (request.user.is_superuser or 
            request.user.is_staff or
            user_dept in ['Management', 'Staff']):
        messages.error(request, 'Access denied. Management or staff permissions required.')
        return redirect('customers:marketing_report_list')

    report = get_object_or_404(MarketingWeeklyReport, pk=pk)

    if report.status not in ['submitted', 'reviewed']:
        messages.error(request, 'Report is not ready for review.')
        return redirect('customers:marketing_report_detail', pk=pk)

    if request.method == 'POST':
        form = MarketingReportReviewForm(request.POST, instance=report)
        if form.is_valid():
            report = form.save(commit=False)
            report.reviewed_by = request.user
            report.reviewed_at = timezone.now()
            report.save()

            messages.success(request, f'Report has been {report.get_status_display().lower()}!')

            # Send notification to marketing staff
            try:
                from notifications.services import NotificationService
                NotificationService.notify_marketing_report_reviewed(report)
            except ImportError:
                pass

            return redirect('customers:marketing_report_detail', pk=pk)
    else:
        form = MarketingReportReviewForm(instance=report)

    return render(request, 'customers/marketing_report_review.html', {
        'form': form,
        'report': report,
        'title': f'Review Marketing Report - {report.marketing_staff.get_full_name()}'
    })


@login_required
def marketing_tickets_view(request):
    """View tickets for customers created by marketing staff"""
    from accounts.permissions import has_permission

    # Check if user has marketing permissions
    user_dept = None
    if hasattr(request.user, 'employee_profile') and request.user.employee_profile and request.user.employee_profile.department:
        user_dept = request.user.employee_profile.department.name

    if not (request.user.is_superuser or 
            request.user.is_staff or
            has_permission(request.user, 'view_marketingweeklyreport') or
            user_dept in ['Marketing', 'Management', 'Staff']):
        messages.error(request, 'Access denied. You need marketing permissions.')
        return redirect('dashboard')

    # Get customers created by this marketing staff (if we track who added customers)
    # For now, show all tickets created by the marketing user
    my_tickets = Ticket.objects.filter(created_by=request.user).order_by('-created_at')

    # Apply filters if any
    status_filter = request.GET.get('status')
    priority_filter = request.GET.get('priority')
    
    if status_filter:
        my_tickets = my_tickets.filter(status=status_filter)
    if priority_filter:
        my_tickets = my_tickets.filter(priority=priority_filter)

    # Pagination
    from django.core.paginator import Paginator
    paginator = Paginator(my_tickets, 20)
    page_number = request.GET.get('page')
    page_obj = paginator.get_page(page_number)

    # Statistics
    total_tickets = my_tickets.count()
    open_tickets = my_tickets.filter(status='open').count()
    in_progress_tickets = my_tickets.filter(status='in_progress').count()
    resolved_tickets = my_tickets.filter(status='resolved').count()

    context = {
        'page_obj': page_obj,
        'total_tickets': total_tickets,
        'open_tickets': open_tickets,
        'in_progress_tickets': in_progress_tickets,
        'resolved_tickets': resolved_tickets,
        'status_filter': status_filter,
        'priority_filter': priority_filter,
    }

    return render(request, 'customers/marketing_tickets.html', context)


@login_required
def marketing_analytics_dashboard(request):
    """Analytics dashboard for marketing reports"""
    from django.db.models import Avg, Sum, Count
    from .models import MarketingWeeklyReport, MarketingLeadInteraction
    from accounts.permissions import has_permission

    # Check if user has marketing analytics permissions
    user_dept = None
    if hasattr(request.user, 'employee_profile') and request.user.employee_profile and request.user.employee_profile.department:
        user_dept = request.user.employee_profile.department.name

    if not (request.user.is_superuser or 
            request.user.is_staff or
            has_permission(request.user, 'view_marketingweeklyreport') or
            user_dept in ['Marketing', 'Management', 'Staff']):
        messages.error(request, 'Access denied. You need marketing permissions to view analytics.')
        return redirect('dashboard')

    # Date range for analysis (last 3 months by default)
    end_date = timezone.now().date()
    start_date = end_date - timedelta(days=90)

    # Base queryset based on user permissions
    
    if user_dept == 'Marketing':
        # Marketing staff see only their reports
        reports = MarketingWeeklyReport.objects.filter(marketing_staff=request.user)
    elif (request.user.is_superuser or 
          request.user.is_staff or
          user_dept in ['Management', 'Staff']):
        # Management, staff, and superusers see all reports
        reports = MarketingWeeklyReport.objects.all()
    else:
        # Other users see no reports
        reports = MarketingWeeklyReport.objects.none()


    reports = reports.filter(
        week_starting__gte=start_date,
        week_ending__lte=end_date,
        status__in=['submitted', 'reviewed', 'approved']
    )

    # Key metrics
    total_reports = reports.count()

    metrics = reports.aggregate(
        total_customers_contacted=Sum('customers_contacted'),
        total_site_visits=Sum('site_visits_conducted'),
        total_demos=Sum('demos_conducted'),
        total_leads_generated=Sum('new_leads_generated'),
        total_qualified_leads=Sum('qualified_leads'),
        total_conversions=Sum('leads_converted'),
        avg_leads_generated=Avg('new_leads_generated'),
        avg_conversions=Avg('leads_converted')
    )

    # Calculate conversion rate safely
    if metrics['avg_leads_generated'] and metrics['avg_leads_generated'] > 0:
        metrics['avg_conversion_rate'] = (metrics['avg_conversions'] or 0) * 100 / metrics['avg_leads_generated']
    else:
        metrics['avg_conversion_rate'] = 0

    # Weekly performance trend
    weekly_performance = reports.values('week_starting').annotate(
        leads=Sum('new_leads_generated'),
        conversions=Sum('leads_converted'),
        site_visits=Sum('site_visits_conducted')
    ).order_by('week_starting')

    # Top performers (if management view)
    top_performers = []
    

    if (request.user.is_superuser or 
        request.user.is_staff or
        user_dept in ['Management', 'Staff']):
        performers_data = reports.values(
            'marketing_staff__first_name',
            'marketing_staff__last_name'
        ).annotate(
            total_leads=Sum('new_leads_generated'),
            total_conversions=Sum('leads_converted'),
            avg_leads=Avg('new_leads_generated'),
            avg_conversions=Avg('leads_converted')
        ).order_by('-total_conversions')[:5]

        # Calculate conversion rates safely
        for performer in performers_data:
            if performer['avg_leads'] and performer['avg_leads'] > 0:
                performer['avg_conversion_rate'] = (performer['avg_conversions'] or 0) * 100 / performer['avg_leads']
            else:
                performer['avg_conversion_rate'] = 0

        top_performers = list(performers_data)

    # Lead interaction analysis
    interactions = MarketingLeadInteraction.objects.filter(
        weekly_report__in=reports
    ).values('interaction_type').annotate(
        count=Count('id'),
        positive_outcomes=Count('id', filter=Q(outcome='positive')),
        conversions=Count('id', filter=Q(outcome='converted'))
    )

    context = {
        'total_reports': total_reports,
        'metrics': metrics,
        'weekly_performance': list(weekly_performance),
        'top_performers': top_performers,
        'interactions': interactions,
        'date_range': f"{start_date} to {end_date}",
    }

    return render(request, 'customers/marketing_analytics_dashboard.html', context)

    return render(request, 'customers/quick_add_customer.html', {'form': form})