import csv
from django.contrib import admin
from django.http import HttpResponse
from django.utils import timezone
from django.utils.html import format_html
from .models import SalesLead, DomainInquiry, ProjectAssessment


# ── Actions ───────────────────────────────────────────────────────────────────
def export_leads_csv(modeladmin, request, queryset):
    response = HttpResponse(content_type='text/csv')
    response['Content-Disposition'] = 'attachment; filename="ft_sales_leads.csv"'
    writer = csv.writer(response)
    writer.writerow(['Name', 'Email', 'Phone', 'Company', 'Service', 'Status', 'Priority', 'Budget', 'Quoted Value', 'Domain', 'Source', 'Created'])
    for l in queryset:
        writer.writerow([
            l.name, l.email, l.phone, l.company,
            l.get_service_type_display(), l.get_status_display(), l.get_priority_display(),
            l.budget, l.quoted_value or '', l.domain_name, l.source,
            l.created_at.strftime('%Y-%m-%d %H:%M')
        ])
    return response
export_leads_csv.short_description = '📥 Export to CSV'


def mark_won(modeladmin, request, queryset):
    queryset.update(status=SalesLead.STATUS_WON, closed_at=timezone.now())
mark_won.short_description = '🟢 Mark as Won'

def mark_lost(modeladmin, request, queryset):
    queryset.update(status=SalesLead.STATUS_LOST, closed_at=timezone.now())
mark_lost.short_description = '🔴 Mark as Lost'

def mark_contacted(modeladmin, request, queryset):
    queryset.update(status=SalesLead.STATUS_CONTACTED)
mark_contacted.short_description = '🟡 Mark as Contacted'


def export_domains_csv(modeladmin, request, queryset):
    response = HttpResponse(content_type='text/csv')
    response['Content-Disposition'] = 'attachment; filename="ft_domain_inquiries.csv"'
    writer = csv.writer(response)
    writer.writerow(['Domain', 'Type', 'Status', 'Name', 'Email', 'Company', 'Registrar', 'Reg Price', 'Our Price', 'Margin', 'Created'])
    for d in queryset:
        writer.writerow([
            d.domain_name, d.get_inquiry_type_display(), d.get_status_display(),
            d.name, d.email, d.company, d.registrar,
            d.reg_price or '', d.our_price or '', d.margin or '',
            d.created_at.strftime('%Y-%m-%d %H:%M')
        ])
    return response
export_domains_csv.short_description = '📥 Export to CSV'


# ── Sales Lead Admin ──────────────────────────────────────────────────────────
@admin.register(SalesLead)
class SalesLeadAdmin(admin.ModelAdmin):
    list_display  = [
        'name', 'email', 'company', 'service_badge', 'status_badge',
        'priority_badge', 'budget', 'quoted_value', 'assigned_to', 'created_at'
    ]
    list_filter   = ['status', 'service_type', 'priority', 'source', 'created_at']
    search_fields = ['name', 'email', 'company', 'subject', 'domain_name']
    actions       = [export_leads_csv, mark_won, mark_lost, mark_contacted]
    date_hierarchy = 'created_at'
    list_per_page  = 25
    save_on_top    = True
    list_editable  = ['assigned_to']

    fieldsets = (
        ('Contact', {
            'fields': ('name', 'email', 'phone', 'company')
        }),
        ('Lead Details', {
            'fields': ('service_type', 'subject', 'message', 'budget', 'source')
        }),
        ('Domain (if applicable)', {
            'fields': ('domain_name', 'domain_tld'),
            'classes': ('collapse',)
        }),
        ('Pipeline', {
            'fields': ('status', 'priority', 'assigned_to', 'quoted_value', 'closed_at')
        }),
        ('Internal Notes', {
            'fields': ('notes',),
            'classes': ('collapse',)
        }),
    )

    def status_badge(self, obj):
        colours = {
            'new': '#1a73e8', 'contacted': '#e8a000', 'quoted': '#e65100',
            'won': '#2e7d32', 'lost': '#c62828', 'on_hold': '#666'
        }
        colour = colours.get(obj.status, '#666')
        labels = {
            'new': 'New', 'contacted': 'Contacted', 'quoted': 'Quoted',
            'won': 'Won', 'lost': 'Lost', 'on_hold': 'On Hold'
        }
        return format_html(
            '<span style="background:{};color:#fff;padding:2px 10px;border-radius:12px;font-size:11px;font-weight:600">{}</span>',
            colour, labels.get(obj.status, obj.status)
        )
    status_badge.short_description = 'Status'
    status_badge.admin_order_field = 'status'

    def priority_badge(self, obj):
        colours = {'low': '#888', 'medium': '#e8a000', 'high': '#d32f2f'}
        colour = colours.get(obj.priority, '#888')
        return format_html('<b style="color:{}">{}</b>', colour, obj.get_priority_display())
    priority_badge.short_description = 'Priority'

    def service_badge(self, obj):
        icons = {
            'domain': '🌐', 'web': '💻', 'app': '📱',
            'marketing': '📣', 'server': '🖥️', 'consultation': '💼',
            'ecommerce': '🛒', 'other': '📋'
        }
        icon = icons.get(obj.service_type, '📋')
        return format_html('{} {}', icon, obj.get_service_type_display())
    service_badge.short_description = 'Service'


# ── Domain Inquiry Admin ──────────────────────────────────────────────────────
@admin.register(DomainInquiry)
class DomainInquiryAdmin(admin.ModelAdmin):
    list_display  = [
        'domain_name', 'inquiry_type', 'status_badge', 'name', 'email',
        'company', 'registrar', 'reg_price', 'our_price', 'margin_display', 'created_at'
    ]
    list_filter   = ['status', 'inquiry_type', 'registrar', 'created_at']
    search_fields = ['domain_name', 'name', 'email', 'company']
    actions       = [export_domains_csv]
    date_hierarchy = 'created_at'
    list_per_page  = 25
    save_on_top    = True

    fieldsets = (
        ('Client', {
            'fields': ('name', 'email', 'phone', 'company')
        }),
        ('Domain Request', {
            'fields': ('inquiry_type', 'domain_name', 'alternatives', 'message', 'budget')
        }),
        ('Processing', {
            'fields': ('status', 'registrar', 'reg_price', 'our_price', 'notes')
        }),
    )

    def status_badge(self, obj):
        colours = {
            'new': '#1a73e8', 'checking': '#e8a000', 'available': '#2e7d32',
            'taken': '#c62828', 'quoted': '#e65100', 'complete': '#555'
        }
        colour = colours.get(obj.status, '#666')
        return format_html(
            '<span style="background:{};color:#fff;padding:2px 10px;border-radius:12px;font-size:11px;font-weight:600">{}</span>',
            colour, obj.get_status_display()
        )
    status_badge.short_description = 'Status'

    def margin_display(self, obj):
        m = obj.margin
        if m is None:
            return '—'
        colour = '#2e7d32' if m > 0 else '#c62828'
        return format_html('<b style="color:{}">£{}</b>', colour, m)
    margin_display.short_description = '💰 Margin'


# ── Project Assessment Admin ──────────────────────────────────────────────────
@admin.register(ProjectAssessment)
class ProjectAssessmentAdmin(admin.ModelAdmin):
    list_display   = [
        'name', 'email', 'company', 'service_type', 'budget',
        'timeline', 'estimate_display', 'status', 'created_at'
    ]
    list_display_links = ['name']
    list_filter    = ['status', 'service_type', 'budget', 'timeline', 'created_at']
    search_fields  = ['name', 'email', 'company', 'project_description']
    date_hierarchy = 'created_at'
    list_per_page  = 25
    save_on_top    = True

    fieldsets = (
        ('Client', {
            'fields': ('tenant', 'name', 'email', 'phone', 'company')
        }),
        ('Project Brief', {
            'fields': ('service_type', 'features_requested', 'project_description', 'reference_sites', 'budget', 'timeline')
        }),
        ('Admin Estimate (private — never shown to client)', {
            'fields': ('est_weeks_min', 'est_weeks_max', 'est_cost_min', 'est_cost_max', 'internal_notes')
        }),
        ('Pipeline', {
            'fields': ('status', 'ip_address')
        }),
    )

    readonly_fields = ['ip_address', 'created_at', 'updated_at']
