"""
Financial Admin Interface
Complete accounting management
"""
from django.contrib import admin
from django.utils.html import format_html
from django.db.models import Sum
from .models import (
    FinancialAccount, Transaction, Revenue, Expense,
    Invoice, TaxRecord, FinancialReport, Budget
)


@admin.register(FinancialAccount)
class FinancialAccountAdmin(admin.ModelAdmin):
    list_display = ('code', 'name', 'account_type', 'current_balance', 'is_active')
    list_filter = ('account_type', 'is_active')
    search_fields = ('code', 'name')
    readonly_fields = ('current_balance',)


@admin.register(Transaction)
class TransactionAdmin(admin.ModelAdmin):
    list_display = ('transaction_number', 'transaction_type', 'amount', 'transaction_date', 'created_by')
    list_filter = ('transaction_type', 'transaction_date')
    search_fields = ('transaction_number', 'description')
    readonly_fields = ('transaction_number', 'created_at')
    date_hierarchy = 'transaction_date'
    
    fieldsets = (
        ('Transaction Info', {
            'fields': ('transaction_number', 'transaction_type', 'description', 'amount')
        }),
        ('Accounts', {
            'fields': ('debit_account', 'credit_account')
        }),
        ('References', {
            'fields': ('order', 'vendor')
        }),
        ('Metadata', {
            'fields': ('created_by', 'transaction_date', 'created_at')
        }),
    )


@admin.register(Revenue)
class RevenueAdmin(admin.ModelAdmin):
    list_display = ('revenue_type', 'description', 'gross_amount', 'net_amount', 'revenue_date')
    list_filter = ('revenue_type', 'revenue_date')
    search_fields = ('description',)
    date_hierarchy = 'revenue_date'
    
    readonly_fields = ('net_amount',)
    
    def changelist_view(self, request, extra_context=None):
        # Add summary to the view
        response = super().changelist_view(request, extra_context=extra_context)
        try:
            qs = response.context_data['cl'].queryset
        except (AttributeError, KeyError):
            return response
        
        metrics = {
            'total_gross': qs.aggregate(Sum('gross_amount'))['gross_amount__sum'] or 0,
            'total_net': qs.aggregate(Sum('net_amount'))['net_amount__sum'] or 0,
        }
        response.context_data['summary'] = metrics
        return response


@admin.register(Expense)
class ExpenseAdmin(admin.ModelAdmin):
    list_display = ('expense_number', 'category', 'amount', 'payment_status', 'expense_date', 'vendor_name')
    list_filter = ('category', 'payment_status', 'expense_date')
    search_fields = ('expense_number', 'description', 'vendor_name')
    date_hierarchy = 'expense_date'
    readonly_fields = ('expense_number',)
    
    fieldsets = (
        ('Expense Info', {
            'fields': ('expense_number', 'category', 'description', 'amount', 'tax_amount')
        }),
        ('Vendor/Supplier', {
            'fields': ('vendor_name', 'invoice_number', 'receipt')
        }),
        ('Payment', {
            'fields': ('payment_method', 'payment_status', 'expense_date', 'due_date', 'paid_date')
        }),
        ('References', {
            'fields': ('transaction', 'created_by')
        }),
    )
    
    actions = ['mark_as_paid']
    
    def mark_as_paid(self, request, queryset):
        from django.utils import timezone
        queryset.update(payment_status='PAID', paid_date=timezone.now().date())
        self.message_user(request, f'{queryset.count()} expenses marked as paid.')
    mark_as_paid.short_description = 'Mark selected as paid'


@admin.register(Invoice)
class InvoiceAdmin(admin.ModelAdmin):
    list_display = ('invoice_number', 'client_name', 'total', 'status', 'invoice_date', 'due_date')
    list_filter = ('status', 'invoice_date')
    search_fields = ('invoice_number', 'client_name', 'client_email')
    date_hierarchy = 'invoice_date'
    readonly_fields = ('invoice_number',)
    
    fieldsets = (
        ('Invoice Info', {
            'fields': ('invoice_number', 'status')
        }),
        ('Client', {
            'fields': ('client_name', 'client_email', 'client_address')
        }),
        ('Amounts', {
            'fields': ('subtotal', 'tax_rate', 'tax_amount', 'total')
        }),
        ('Dates', {
            'fields': ('invoice_date', 'due_date', 'paid_date')
        }),
        ('Notes', {
            'fields': ('notes', 'terms')
        }),
    )


@admin.register(TaxRecord)
class TaxRecordAdmin(admin.ModelAdmin):
    list_display = ('tax_type', 'description', 'tax_amount', 'period_start', 'period_end', 'is_paid')
    list_filter = ('tax_type', 'is_paid', 'period_end')
    search_fields = ('description',)
    date_hierarchy = 'period_end'


@admin.register(FinancialReport)
class FinancialReportAdmin(admin.ModelAdmin):
    list_display = ('report_name', 'report_type', 'net_profit', 'period_start', 'period_end', 'generated_at')
    list_filter = ('report_type', 'generated_at')
    search_fields = ('report_name',)
    date_hierarchy = 'generated_at'
    
    readonly_fields = ('generated_at', 'generated_by')


@admin.register(Budget)
class BudgetAdmin(admin.ModelAdmin):
    list_display = ('name', 'fiscal_year', 'revenue_budget', 'expense_budget', 'profit_target', 'budget_utilization_display')
    list_filter = ('fiscal_year', 'is_active')
    search_fields = ('name',)
    
    readonly_fields = ('actual_revenue', 'actual_expenses', 'actual_profit')
    
    def budget_utilization_display(self, obj):
        utilization = float(obj.budget_utilization)
        color = 'green' if utilization <= 80 else ('orange' if utilization <= 100 else 'red')
        value = "{:.1f}%".format(utilization)
        return format_html('<span style="color: {};">{}</span>', color, value)
    budget_utilization_display.short_description = 'Budget Utilization'
