import csv

from django.contrib import admin
from django.http import HttpResponse

from .models import LeadSettings, LeadSubmission


@admin.action(description="Mark selected leads as Contacted")
def mark_contacted(modeladmin, request, queryset):
    queryset.update(status=LeadSubmission.STATUS_CONTACTED)


@admin.action(description="Mark selected leads as Interested")
def mark_interested(modeladmin, request, queryset):
    queryset.update(status=LeadSubmission.STATUS_INTERESTED)


@admin.action(description="Mark selected leads as Follow-up")
def mark_follow_up(modeladmin, request, queryset):
    queryset.update(status=LeadSubmission.STATUS_FOLLOW_UP)


@admin.action(description="Mark selected leads as Converted")
def mark_converted(modeladmin, request, queryset):
    queryset.update(status=LeadSubmission.STATUS_CONVERTED)


@admin.action(description="Mark selected leads as Closed")
def mark_closed(modeladmin, request, queryset):
    queryset.update(status=LeadSubmission.STATUS_CLOSED)


@admin.action(description="Mark selected leads as Spam")
def mark_spam(modeladmin, request, queryset):
    queryset.update(status=LeadSubmission.STATUS_SPAM, is_spam=True)


@admin.action(description="Export selected leads as CSV")
def export_leads_csv(modeladmin, request, queryset):
    response = HttpResponse(content_type="text/csv")
    response["Content-Disposition"] = "attachment; filename=public_leads.csv"

    writer = csv.writer(response)
    writer.writerow([
        "id",
        "lead_type",
        "status",
        "full_name",
        "email",
        "mobile_number",
        "city",
        "interested_category",
        "source_page_name",
        "source_page_url",
        "campaign_source",
        "referral_source",
        "created_at",
    ])

    for lead in queryset.order_by("-created_at"):
        writer.writerow([
            lead.id,
            lead.lead_type,
            lead.status,
            lead.full_name,
            lead.email,
            lead.mobile_number,
            lead.city,
            lead.interested_category,
            lead.source_page_name,
            lead.source_page_url,
            lead.campaign_source,
            lead.referral_source,
            lead.created_at,
        ])

    return response


@admin.register(LeadSubmission)
class LeadSubmissionAdmin(admin.ModelAdmin):
    list_display = (
        "lead_type",
        "status",
        "full_name",
        "email",
        "mobile_number",
        "source_page_name",
        "campaign_source",
        "is_spam",
        "created_at",
    )
    list_filter = ("lead_type", "status", "is_spam", "source_page_type", "campaign_source", "created_at")
    search_fields = (
        "full_name",
        "email",
        "mobile_number",
        "city",
        "interested_category",
        "source_page_name",
        "source_page_url",
    )
    readonly_fields = ("created_at", "updated_at", "ip_address", "user_agent", "device_info", "payload")
    autocomplete_fields = ("assigned_to",)
    actions = [
        mark_contacted,
        mark_interested,
        mark_follow_up,
        mark_converted,
        mark_closed,
        mark_spam,
        export_leads_csv,
    ]


@admin.register(LeadSettings)
class LeadSettingsAdmin(admin.ModelAdmin):
    list_display = (
        "enable_public_forms",
        "enable_admin_notifications",
        "enable_user_auto_reply",
        "export_enabled",
        "updated_at",
    )

    def has_add_permission(self, request):
        if LeadSettings.objects.exists():
            return False
        return super().has_add_permission(request)
