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 Ticket, TicketReply


# ── Actions ───────────────────────────────────────────────────────────────────
def export_tickets_csv(modeladmin, request, queryset):
    response = HttpResponse(content_type='text/csv')
    response['Content-Disposition'] = 'attachment; filename="ft_tickets.csv"'
    writer = csv.writer(response)
    writer.writerow(['Ticket #', 'Source', 'Status', 'Priority', 'Name', 'Email', 'Phone', 'Company', 'Subject', 'Created'])
    for t in queryset:
        writer.writerow([
            t.ticket_number, t.get_source_display(), t.get_status_display(),
            t.get_priority_display(), t.sender_name, t.sender_email,
            t.sender_phone, t.sender_company, t.subject,
            t.created_at.strftime('%Y-%m-%d %H:%M')
        ])
    return response
export_tickets_csv.short_description = '📥 Export to CSV'


def mark_resolved(modeladmin, request, queryset):
    queryset.update(status=Ticket.STATUS_RESOLVED, resolved_at=timezone.now())
mark_resolved.short_description = '✅ Mark Resolved'

def mark_in_progress(modeladmin, request, queryset):
    queryset.update(status=Ticket.STATUS_IN_PROGRESS)
mark_in_progress.short_description = '🔄 Mark In Progress'

def mark_waiting(modeladmin, request, queryset):
    queryset.update(status=Ticket.STATUS_WAITING)
mark_waiting.short_description = '⏳ Mark Waiting on Client'


# ── Inlines ───────────────────────────────────────────────────────────────────
class TicketReplyInline(admin.StackedInline):
    model = TicketReply
    extra = 1
    fields = ['message', 'is_internal', 'author_name', 'sent_by_email']
    readonly_fields = []


# ── Ticket Admin ──────────────────────────────────────────────────────────────
@admin.register(Ticket)
class TicketAdmin(admin.ModelAdmin):
    list_display = [
        'ticket_number', 'status_badge', 'priority_badge', 'source_badge',
        'sender_name', 'sender_email', 'sender_company', 'subject_short',
        'reply_count', 'created_at'
    ]
    list_filter   = ['status', 'priority', 'source', 'created_at', 'tenant']
    search_fields = ['ticket_number', 'sender_name', 'sender_email', 'sender_company', 'subject']
    readonly_fields = ['ticket_number', 'created_at', 'updated_at', 'resolved_at']
    actions       = [export_tickets_csv, mark_resolved, mark_in_progress, mark_waiting]
    date_hierarchy = 'created_at'
    list_per_page = 25
    inlines       = [TicketReplyInline]
    save_on_top   = True

    fieldsets = (
        ('Ticket', {
            'fields': ('ticket_number', 'source', 'status', 'priority', 'assigned_to', 'tenant')
        }),
        ('Client Details', {
            'fields': ('sender_name', 'sender_email', 'sender_phone', 'sender_company', 'user')
        }),
        ('Message', {
            'fields': ('subject', 'category', 'message')
        }),
        ('Internal Notes', {
            'fields': ('internal_note', 'email_sent', 'client_notified'),
            'classes': ('collapse',)
        }),
        ('Timestamps', {
            'fields': ('created_at', 'updated_at', 'resolved_at'),
            'classes': ('collapse',)
        }),
    )

    def status_badge(self, obj):
        colours = {
            'new': '#1a73e8', 'open': '#0077cc', 'in_progress': '#e8a000',
            'waiting': '#9c27b0', 'resolved': '#2e7d32', 'closed': '#666'
        }
        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'
    status_badge.admin_order_field = 'status'

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

    def source_badge(self, obj):
        icons = {
            'contact': '📧', 'auction': '🔨', 'marketplace': '🛒',
            'startup': '🚀', 'chat': '💬', 'domain': '🌐', 'order': '📦'
        }
        icon = icons.get(obj.source, '📋')
        return format_html('{} {}', icon, obj.get_source_display())
    source_badge.short_description = 'Source'

    def subject_short(self, obj):
        return obj.subject[:55] + '…' if len(obj.subject) > 55 else obj.subject
    subject_short.short_description = 'Subject'

    def reply_count(self, obj):
        count = obj.replies.count()
        colour = '#2e7d32' if count > 0 else '#bbb'
        return format_html('<b style="color:{}">{}</b>', colour, count)
    reply_count.short_description = '💬'


@admin.register(TicketReply)
class TicketReplyAdmin(admin.ModelAdmin):
    list_display  = ['ticket', 'author_name', 'is_internal', 'sent_by_email', 'created_at']
    list_filter   = ['is_internal', 'sent_by_email']
    search_fields = ['ticket__ticket_number', 'author_name', 'message']
    readonly_fields = ['created_at']
