from django.contrib import admin
from .models import Cargo, Funcionario, UsuarioFuncionario
from django.http import HttpResponse
from django.utils.html import format_html
import csv


@admin.register(Cargo)
class CargoAdmin(admin.ModelAdmin):
    list_display = ('codigo', 'nome')
    search_fields = ('codigo', 'nome')
    ordering = ('codigo',)


class UsuarioFuncionarioInline(admin.StackedInline):
    model = UsuarioFuncionario
    extra = 0
    readonly_fields = ('data_criacao',)
    can_delete = False


@admin.register(Funcionario)
class FuncionarioAdmin(admin.ModelAdmin):
    list_display = (
        'nome_completo', 'cpf', 'email', 'cidade',
        'estado', 'data_admissao', 'tipo_contrato', 'exibir_foto'
    )
    list_filter = ('estado', 'tipo_contrato', 'cargo', 'data_admissao')
    search_fields = ('nome_completo', 'cpf', 'cidade', 'email')
    autocomplete_fields = ['cargo']
    readonly_fields = ('data_criacao', 'data_atualizacao', 'exibir_foto')
    inlines = [UsuarioFuncionarioInline]

    fieldsets = (
        ('Dados Pessoais', {
            'fields': ('nome_completo', 'data_nascimento', 'cpf', 'rg', 'genero', 'estado_civil')
        }),
        ('Endereço', {
            'fields': ('endereco', 'bairro', 'cidade', 'estado', 'cep')
        }),
        ('Contato', {
            'fields': ('telefone', 'celular', 'email')
        }),
        ('Profissional', {
            'fields': ('cargo', 'departamento', 'data_admissao', 'salario', 'tipo_contrato')
        }),
        ('Outros', {
            'fields': ('foto', 'exibir_foto', 'data_criacao', 'data_atualizacao')
        }),
    )

    actions = ['exportar_csv']

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

    def exibir_foto(self, obj):
        if obj.foto:
            return format_html('<img src="{}" width="50" height="50" style="object-fit: cover; border-radius: 8px;" />', obj.foto.url)
        return "Sem foto"

    exibir_foto.short_description = "Foto"


@admin.register(UsuarioFuncionario)
class UsuarioFuncionarioAdmin(admin.ModelAdmin):
    list_display = ('funcionario', 'usuario', 'is_admin', 'data_criacao')
    list_filter = ('is_admin', 'data_criacao')
    search_fields = ('funcionario__nome_completo', 'usuario__username')
    autocomplete_fields = ['funcionario', 'usuario']
    readonly_fields = ('data_criacao',)

    fieldsets = (
        ('Vínculo com Funcionário', {
            'fields': ('funcionario', 'usuario')
        }),
        ('Permissões', {
            'fields': ('is_admin', 'menu_permissions')
        }),
        ('Outros', {
            'fields': ('data_criacao',)
        }),
    )
