from django.contrib import admin
from django.utils.html import format_html
from .models import (
    Sede, Categoria, Producto, VariacionCatalogo, ProductoVariacion,
    Jornada, Venta, InventarioItem, Gasto, Mesa, Pedido, HorarioLaboral, DiaLaboral,
)


class DiaLaboralInline(admin.TabularInline):
    model = DiaLaboral
    extra = 0
    can_delete = False
    fields = ['dia_nombre', 'activo', 'hora_inicio', 'hora_fin']
    readonly_fields = ['dia_nombre']
    ordering = ['dia']

    def dia_nombre(self, obj):
        return obj.get_dia_display()
    dia_nombre.short_description = 'Día'

    def has_add_permission(self, request, obj=None):
        # Siempre existen exactamente 7 filas (una por día); no se agregan ni se borran.
        return False


@admin.register(HorarioLaboral)
class HorarioLaboralAdmin(admin.ModelAdmin):
    list_display = ['__str__', 'dias_activos_display']
    inlines = [DiaLaboralInline]

    def has_add_permission(self, request):
        # Configuración única: no se permite crear un segundo horario.
        return not HorarioLaboral.objects.exists()

    def has_delete_permission(self, request, obj=None):
        return False

    def change_view(self, request, object_id, form_url='', extra_context=None):
        HorarioLaboral.get_solo()  # asegura que existan las 7 filas de días antes de renderizar
        return super().change_view(request, object_id, form_url, extra_context)


@admin.register(Sede)
class SedeAdmin(admin.ModelAdmin):
    list_display = ['nombre']


@admin.register(Categoria)
class CategoriaAdmin(admin.ModelAdmin):
    list_display = ['nombre']


class ProductoVariacionInline(admin.TabularInline):
    model = ProductoVariacion
    extra = 1
    autocomplete_fields = ['variacion']
    fields = ['variacion', 'precio', 'activo']


@admin.register(Producto)
class ProductoAdmin(admin.ModelAdmin):
    list_display = ['miniatura', 'nombre', 'categoria', 'precio', 'activo']
    list_filter = ['categoria', 'activo']
    search_fields = ['nombre']
    list_editable = ['activo']
    readonly_fields = ['vista_previa']
    fields = ['categoria', 'nombre', 'precio', 'activo', 'imagen', 'vista_previa']
    inlines = [ProductoVariacionInline]

    def miniatura(self, obj):
        if obj.imagen:
            return format_html(
                '<img src="{}" style="width:32px;height:32px;object-fit:cover;border-radius:4px">',
                obj.imagen.url
            )
        return '—'
    miniatura.short_description = ''

    def vista_previa(self, obj):
        if obj.imagen:
            return format_html(
                '<img src="{}" style="width:120px;height:120px;object-fit:cover;border-radius:8px">',
                obj.imagen.url
            )
        return 'Sin imagen'
    vista_previa.short_description = 'Vista previa'


@admin.register(VariacionCatalogo)
class VariacionCatalogoAdmin(admin.ModelAdmin):
    list_display = ['nombre', 'grupo', 'tipo', 'precio', 'activo']
    list_filter = ['grupo', 'tipo', 'activo']
    list_editable = ['grupo', 'tipo', 'precio', 'activo']
    search_fields = ['nombre']


class VentaInline(admin.TabularInline):
    model = Venta
    extra = 0
    readonly_fields = ['valor', 'creado']


class GastoInline(admin.TabularInline):
    model = Gasto
    extra = 0
    readonly_fields = ['creado']


@admin.register(Jornada)
class JornadaAdmin(admin.ModelAdmin):
    list_display = [
        'fecha', 'sede', 'base', 'total_ventas', 'total_efectivo', 'total_nequi', 'total_bold',
        'total_gastos', 'caja', 'efectivo_contado', 'diferencia_caja', 'cerrada', 'cerrada_por',
    ]
    list_filter = ['sede', 'cerrada']
    inlines = [VentaInline, GastoInline]


@admin.register(Venta)
class VentaAdmin(admin.ModelAdmin):
    list_display = ['jornada', 'mesa', 'cantidad', 'producto', 'variacion', 'valor', 'metodo_pago', 'liquidado', 'vendedor', 'nota', 'creado']
    list_filter = ['jornada', 'metodo_pago', 'liquidado', 'vendedor']
    list_editable = ['liquidado']
    search_fields = ['mesa', 'producto__nombre', 'nota']


@admin.register(Mesa)
class MesaAdmin(admin.ModelAdmin):
    list_display = ['nombre', 'sede', 'activa']
    list_filter = ['sede', 'activa']
    list_editable = ['activa']
    search_fields = ['nombre']


@admin.register(Pedido)
class PedidoAdmin(admin.ModelAdmin):
    list_display = ['mesa', 'jornada', 'estado', 'mesero', 'metodo_pago', 'total', 'creado']
    list_filter = ['jornada', 'estado', 'mesa__sede']
    inlines = [VentaInline]


@admin.register(Gasto)
class GastoAdmin(admin.ModelAdmin):
    list_display = ['jornada', 'categoria', 'descripcion', 'valor', 'creado']
    list_filter = ['jornada', 'categoria']
    search_fields = ['descripcion']


@admin.register(InventarioItem)
class InventarioItemAdmin(admin.ModelAdmin):
    list_display = ['nombre', 'jornada', 'inicial', 'compras', 'ventas_contadas', 'faltan', 'sobran', 'final']
