from django.contrib import admin
from .models import Estufa, Selecao, LogFinalizacaoEstufa
from django.utils.translation import gettext_lazy as _
from django.contrib.admin import SimpleListFilter
from django.http import HttpResponse
import csv


# Filtro por ano para Estufa
class AnoEstufaFiltro(SimpleListFilter):
    title = _('Ano')
    parameter_name = 'ano'

    def lookups(self, request, model_admin):
        anos = set(obj.data_estufa.year for obj in model_admin.model.objects.all() if obj.data_estufa)
        return [(ano, str(ano)) for ano in sorted(anos)]

    def queryset(self, request, queryset):
        if self.value():
            return queryset.filter(data_estufa__year=self.value())
        return queryset


# Filtro por ano para Selecao
class AnoSelecaoFiltro(SimpleListFilter):
    title = _('Ano')
    parameter_name = 'ano'

    def lookups(self, request, model_admin):
        anos = set(obj.data_selecao.year for obj in model_admin.model.objects.all() if obj.data_selecao)
        return [(ano, str(ano)) for ano in sorted(anos)]

    def queryset(self, request, queryset):
        if self.value():
            return queryset.filter(data_selecao__year=self.value())
        return queryset


@admin.register(Estufa)
class EstufaAdmin(admin.ModelAdmin):
    list_display = (
        'semeadura', 'get_numero_lote', 'data_estufa',
        'quantidade_mortalidade', 'finalizado', 'registrado_por'
    )
    list_filter = ('finalizado', AnoEstufaFiltro, 'registrado_por')
    search_fields = ('semeadura__numero_muda', 'semeadura__lote__numero_lote')
    autocomplete_fields = ['semeadura', 'registrado_por']
    date_hierarchy = 'data_estufa'
    readonly_fields = ('get_numero_lote',)

    fieldsets = (
        ('Informações da Semeadura', {
            'fields': ('semeadura', 'get_numero_lote')
        }),
        ('Dados de Mortalidade', {
            'fields': ('data_estufa', 'quantidade_mortalidade', 'finalizado', 'registrado_por')
        }),
    )

    actions = ['marcar_como_finalizado', 'exportar_csv']

    @admin.action(description="Marcar como finalizado")
    def marcar_como_finalizado(self, request, queryset):
        updated = queryset.update(finalizado=True)
        self.message_user(request, f"{updated} registros marcados como finalizados.")

    @admin.action(description="Exportar para CSV")
    def exportar_csv(self, request, queryset):
        response = HttpResponse(content_type='text/csv')
        response['Content-Disposition'] = 'attachment; filename=estufas.csv'
        writer = csv.writer(response)
        writer.writerow([field.name for field in Estufa._meta.fields])
        for obj in queryset:
            writer.writerow([getattr(obj, field.name) for field in Estufa._meta.fields])
        return response


@admin.register(Selecao)
class SelecaoAdmin(admin.ModelAdmin):
    list_display = (
        'semeadura', 'get_numero_lote', 'data_selecao',
        'quantidade_selecao', 'venda', 'registrado_por'
    )
    list_filter = ('venda', AnoSelecaoFiltro, 'registrado_por')
    search_fields = ('semeadura__numero_muda', 'semeadura__lote__numero_lote')
    autocomplete_fields = ['semeadura', 'registrado_por']
    date_hierarchy = 'data_selecao'
    readonly_fields = ('get_numero_lote',)

    fieldsets = (
        ('Informações da Semeadura', {
            'fields': ('semeadura', 'get_numero_lote')
        }),
        ('Dados de Seleção', {
            'fields': ('data_selecao', 'quantidade_selecao', 'venda', 'registrado_por')
        }),
    )

    actions = ['marcar_como_finalizado', 'exportar_csv']

    @admin.action(description="Marcar como venda")
    def marcar_como_finalizado(self, request, queryset):
        updated = queryset.update(venda=True)
        self.message_user(request, f"{updated} seleções marcadas como venda.")

    @admin.action(description="Exportar para CSV")
    def exportar_csv(self, request, queryset):
        response = HttpResponse(content_type='text/csv')
        response['Content-Disposition'] = 'attachment; filename=selecoes.csv'
        writer = csv.writer(response)
        writer.writerow([field.name for field in Selecao._meta.fields])
        for obj in queryset:
            writer.writerow([getattr(obj, field.name) for field in Selecao._meta.fields])
        return response


@admin.register(LogFinalizacaoEstufa)
class LogFinalizacaoEstufaAdmin(admin.ModelAdmin):
    list_display = (
        'semeadura', 'numero_lote', 'data_lote',
        'data_exclusao', 'hora_exclusao',
        'usuario_exclusao', 'nome_usuario_exclusao',
        'motivo_formatado'
    )
    list_filter = ('data_exclusao', 'motivo_exclusao')
    search_fields = ('numero_lote', 'nome_usuario_exclusao', 'motivo_exclusao')
    readonly_fields = (
        'semeadura', 'numero_lote', 'data_lote',
        'data_exclusao', 'hora_exclusao',
        'usuario_exclusao', 'nome_usuario_exclusao',
        'motivo_exclusao', 'motivo_exclusao_outros'
    )

    def motivo_formatado(self, obj):
        if obj.motivo_exclusao == 'Outros' and obj.motivo_exclusao_outros:
            return f"{obj.motivo_exclusao} - {obj.motivo_exclusao_outros}"
        return obj.motivo_exclusao

    motivo_formatado.short_description = "Motivo"

    def has_add_permission(self, request):
        return False

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

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