"""
Admin — App Finance
======================
Configuração do painel admin para TaxBracket, Clinica, Invoice, Payment.
"""

from django.contrib import admin
from django.utils.html import format_html

from .models import (
    CierreDia,
    Clinica,
    DetalleCierreDia,
    DetalleFacturaDia,
    DiaClinica,
    DiaClinicaDetalle,
    Examen,
    FacturaDia,
    Invoice,
    Payment,
    TaxBracket,
    TipoCliente,
)


# ============================================================
# TRAMO IRT
# ============================================================
@admin.register(TaxBracket)
class TaxBracketAdmin(admin.ModelAdmin):
    list_display = ("nombre", "porciento_irt", "is_active")
    list_editable = ("porciento_irt", "is_active")
    search_fields = ("nombre",)
    ordering = ("nombre",)


# ============================================================
# CLÍNICA
# ============================================================
@admin.register(Clinica)
class ClinicaAdmin(admin.ModelAdmin):
    list_display = ("nombre", "telefono", "nif", "is_active")
    search_fields = ("nombre", "nif")


# ============================================================
# FACTURA (INVOICE)
# ============================================================
class PaymentInline(admin.TabularInline):
    model = Payment
    extra = 0
    readonly_fields = ("registrado_por", "fecha")
    fields = ("monto", "metodo", "referencia", "registrado_por", "fecha")


@admin.register(Invoice)
class InvoiceAdmin(admin.ModelAdmin):
    list_display = (
        "numero",
        "paciente_nombre",
        "servicio",
        "subtotal_fmt",
        "irt_fmt",
        "total_fmt",
        "estado_badge",
        "metodo_pago",
        "fecha_emision",
    )
    list_filter = ("estado", "metodo_pago", "fecha_emision", "clinica")
    search_fields = ("numero", "paciente__nombre", "paciente__apellido", "paciente__email")
    readonly_fields = ("numero", "subtotal", "irt", "total", "fecha_emision")
    date_hierarchy = "fecha_emision"
    inlines = [PaymentInline]
    actions = ["anular_facturas"]

    @admin.display(description="Paciente")
    def paciente_nombre(self, obj):
        return obj.paciente.get_full_name()

    @admin.display(description="Subtotal")
    def subtotal_fmt(self, obj):
        return f"{obj.subtotal:,.2f} Kz"

    @admin.display(description="IRT")
    def irt_fmt(self, obj):
        return f"{obj.irt:,.2f} Kz"

    @admin.display(description="Total")
    def total_fmt(self, obj):
        return f"{obj.total:,.2f} Kz"

    @admin.display(description="Estado")
    def estado_badge(self, obj):
        colors = {
            "pendiente": "#f59e0b",
            "pagado": "#10b981",
            "pago_parcial": "#3b82f6",
            "anulado": "#ef4444",
        }
        color = colors.get(obj.estado, "#6b7280")
        return format_html(
            '<span style="background:{}; color:#fff; padding:3px 10px; '
            'border-radius:12px; font-size:11px; font-weight:600;">{}</span>',
            color,
            obj.get_estado_display(),
        )

    @admin.action(description="Anular faturas selecionadas")
    def anular_facturas(self, request, queryset):
        updated = queryset.exclude(estado=Invoice.Estado.ANULADO).update(
            estado=Invoice.Estado.ANULADO
        )
        self.message_user(request, f"{updated} fatura(s) anulada(s).")


# ============================================================
# PAGO (PAYMENT)
# ============================================================
@admin.register(Payment)
class PaymentAdmin(admin.ModelAdmin):
    list_display = ("factura", "monto_fmt", "metodo", "referencia", "registrado_por", "fecha")
    list_filter = ("metodo", "fecha")
    search_fields = ("factura__numero", "referencia")
    readonly_fields = ("registrado_por",)

    @admin.display(description="Montante")
    def monto_fmt(self, obj):
        return f"{obj.monto:,.2f} Kz"


# ============================================================
# TIPO DE CLIENTE
# ============================================================
@admin.register(TipoCliente)
class TipoClienteAdmin(admin.ModelAdmin):
    list_display = ("nombre", "descripcion", "is_active")
    search_fields = ("nombre",)
    list_filter = ("is_active",)


# ============================================================
# EXÁMENES
# ============================================================
@admin.register(Examen)
class ExamenAdmin(admin.ModelAdmin):
    list_display = ("nombre", "precio_venta_fmt", "is_active")
    search_fields = ("nombre",)
    list_filter = ("is_active",)
    list_editable = ("is_active",)

    @admin.display(description="Preço Venda")
    def precio_venta_fmt(self, obj):
        return f"{obj.precio_venta:,.2f} Kz"


# ============================================================
# FACTURA DÍA CLÍNICA
# ============================================================
class DetalleFacturaDiaInline(admin.TabularInline):
    model = DetalleFacturaDia
    extra = 0
    readonly_fields = ("tipo", "nombre_item", "precio_venta", "porciento_medico", "subtotal_medico", "irt_porciento", "irt_monto")


@admin.register(FacturaDia)
class FacturaDiaAdmin(admin.ModelAdmin):
    list_display = (
        "numero_factura",
        "paciente_nombre",
        "tipo_cliente",
        "precio_venta_total_fmt",
        "porciento_medico_total_fmt",
        "irt_porciento",
        "estado_badge",
        "clinica",
        "fecha",
    )
    list_filter = ("estado", "clinica", "fecha")
    search_fields = ("numero_factura", "paciente_nombre")
    readonly_fields = ("precio_venta_total", "porciento_medico_total", "irt_porciento", "clinica", "dia_clinica", "fecha")
    inlines = [DetalleFacturaDiaInline]

    @admin.display(description="P. Venda Total")
    def precio_venta_total_fmt(self, obj):
        return f"{obj.precio_venta_total:,.2f} Kz"

    @admin.display(description="% Médico Total")
    def porciento_medico_total_fmt(self, obj):
        return f"{obj.porciento_medico_total:,.2f} Kz"

    @admin.display(description="Estado")
    def estado_badge(self, obj):
        colors = {
            "sin_confirmar": "#f59e0b",
            "confirmada": "#10b981",
            "anulada": "#ef4444",
        }
        color = colors.get(obj.estado, "#6b7280")
        return format_html(
            '<span style="background:{}; color:#fff; padding:3px 10px; '
            'border-radius:12px; font-size:11px; font-weight:600;">{}</span>',
            color,
            obj.get_estado_display(),
        )


# ============================================================
# DÍA CLÍNICA
# ============================================================
class DiaClinicaDetalleInline(admin.TabularInline):
    model = DiaClinicaDetalle
    extra = 0
    fields = (
        "numero", "numero_factura", "paciente", "tipo_cliente",
        "servicio_medico", "laboratorio", "laboratorio_precio",
        "laboratorio_porciento", "imagen", "imagen_precio",
        "imagen_porciento", "proceder", "proceder_precio",
        "proceder_porciento", "examen", "examen_precio",
    )


@admin.register(DiaClinica)
class DiaClinicaAdmin(admin.ModelAdmin):
    list_display = ("clinica", "fecha", "estado_badge", "abierto_por", "cerrado_por", "total_precio_venta_fmt", "total_porciento_medico_fmt")
    list_filter = ("estado", "clinica", "fecha")
    search_fields = ("clinica__nombre",)
    date_hierarchy = "fecha"
    inlines = [DiaClinicaDetalleInline]

    @admin.display(description="Estado")
    def estado_badge(self, obj):
        color = "#10b981" if obj.estado == "abierto" else "#6b7280"
        return format_html(
            '<span style="background:{}; color:#fff; padding:3px 10px; '
            'border-radius:12px; font-size:11px; font-weight:600;">{}</span>',
            color, obj.get_estado_display(),
        )

    @admin.display(description="Total Preço Venda")
    def total_precio_venta_fmt(self, obj):
        return f"{obj.total_precio_venta:,.2f} Kz"

    @admin.display(description="Total % Médico")
    def total_porciento_medico_fmt(self, obj):
        return f"{obj.total_porciento_medico:,.2f} Kz"


# ============================================================
# CIERRE DEL DÍA
# ============================================================
class DetalleCierreDiaInline(admin.TabularInline):
    model = DetalleCierreDia
    extra = 0
    readonly_fields = (
        "factura_dia", "numero_factura", "paciente_nombre",
        "tipo_cliente_nombre", "precio_venta_total", "porciento_medico_total",
        "irt_porciento", "irt_monto", "ingreso_neto", "observaciones",
    )


@admin.register(CierreDia)
class CierreDiaAdmin(admin.ModelAdmin):
    list_display = (
        "clinica", "fecha", "cerrado_por", "total_facturas",
        "total_precio_venta_fmt", "total_porciento_medico_fmt",
        "total_irt_monto_fmt", "total_ingreso_neto_fmt",
    )
    list_filter = ("clinica", "fecha")
    search_fields = ("clinica__nombre",)
    date_hierarchy = "fecha"
    readonly_fields = (
        "dia_clinica", "clinica", "fecha", "cerrado_por", "hora_cierre",
        "total_facturas", "total_precio_venta", "total_porciento_medico",
        "total_irt_porciento", "total_irt_monto", "total_ingreso_neto",
    )
    inlines = [DetalleCierreDiaInline]

    @admin.display(description="P. Venda Total")
    def total_precio_venta_fmt(self, obj):
        return f"{obj.total_precio_venta:,.2f} Kz"

    @admin.display(description="% Médico Total")
    def total_porciento_medico_fmt(self, obj):
        return f"{obj.total_porciento_medico:,.2f} Kz"

    @admin.display(description="IRT")
    def total_irt_monto_fmt(self, obj):
        return f"{obj.total_irt_monto:,.2f} Kz"

    @admin.display(description="Receita Líquida")
    def total_ingreso_neto_fmt(self, obj):
        return f"{obj.total_ingreso_neto:,.2f} Kz"
