from django.contrib import admin
from django.contrib.admin import AdminSite
from .models import (InfoPolitica, AreaProtegida, FincaPrivada, Sitio, Reino,
                     Observacion, SitioReinoObservacion, Autor, Parcela,
                     Especie, ArbolesPie, ArbolCaido, Tocon,
                     CuadranteSE, Subparcela, Vegetacion)
import csv
from django.http import HttpResponse

class EventAdminSite(AdminSite):
    site_header = "Administrador de INECOA-CONBIBO"
    site_title = "Admin Portal de INECOA-CONBIBO"
    index_title = "Bienvenido al Administrador de INECOA-CONBIBO"

inecoaconbibo_admin_site = EventAdminSite(name="admin_inecoaconbibo")


class ExportCsvMixin:
    def export_as_csv(self, request, queryset):
        meta = self.model._meta
        field_names = [field.name for field in meta.fields]

        response = HttpResponse(content_type='text/csv')
        response['Content-Disposition'] = 'attachment; filename={}.csv'.format(meta)
        writer = csv.writer(response)

        writer.writerow(field_names)
        for obj in queryset:
            row = writer.writerow([getattr(obj, field) for field in field_names])

        return response

    export_as_csv.short_description = "Descargar como CSV"


class InfoPoliticaAdmin(admin.ModelAdmin, ExportCsvMixin):
    list_display = ('id', 'localidad', 'departamento', 'provincia', 'pais')
    list_filter = ('departamento', 'provincia', 'pais')
    list_display_links = ('localidad',)
    actions = ['export_as_csv']


class SitioAdmin(admin.ModelAdmin, ExportCsvMixin):
    list_display = ('id', 'nombre', 'info_politica', 'area_protegida', 'finca_privada',
                    'nom_puntogps', 'lat_puntogps', 'lon_puntogps')
    list_display_links = ('nombre',)
    list_filter = ('info_politica', 'area_protegida', 'finca_privada')
    fields = ('nombre', 'info_politica', 'area_protegida', 'finca_privada',
              'nom_puntogps', 'lat_puntogps', 'lon_puntogps', 'observaciones')
    actions = ['export_as_csv']


class AutorAdmin(admin.ModelAdmin, ExportCsvMixin):
    list_display = ('id', 'nombre', 'apellido')
    list_display_links = ('nombre',)
    actions = ['export_as_csv']


class ParcelaAdmin(admin.ModelAdmin, ExportCsvMixin):
    list_display = ('id', 'num_parcela', 'sitio_reino_observacion', 'nom_puntogps',
                    'lat_puntogps', 'lon_puntogps', 'fecha', 'hora', 'grabador', 'num_marca')
    list_display_links = ('num_parcela',)
    actions = ['export_as_csv']


class EspecieAdmin(admin.ModelAdmin, ExportCsvMixin):
    list_display = ('id', 'nombre_comun', 'nombre_cientifico', 'familia')
    list_filter = ('familia',)
    list_display_links = ('nombre_comun',)
    actions = ['export_as_csv']


class ArbolesPieAdmin(admin.ModelAdmin, ExportCsvMixin):
    list_display = ('id', 'sitio_reino_observacion', 'num_parcela', 'cuadrante',
                    'especie', 'cap', 'dap', 'ht', 'hc', 'hf')
    list_display_links = ('num_parcela',)
    actions = ['export_as_csv']


class AreaProtegidaAdmin(admin.ModelAdmin, ExportCsvMixin):
    list_display = ('id', 'nombre')
    list_display_links = ('nombre',)
    actions = ['export_as_csv']

class FincaPrivadaAdmin(admin.ModelAdmin, ExportCsvMixin):
    list_display = ('id', 'nombre')
    list_display_links = ('nombre',)
    actions = ['export_as_csv']


class ReinoAdmin(admin.ModelAdmin, ExportCsvMixin):
    list_display = ('id', 'nombre')
    list_display_links = ('nombre',)
    actions = ['export_as_csv']

class ObservacionAdmin(admin.ModelAdmin, ExportCsvMixin):
    list_display = ('id', 'nombre')
    list_display_links = ('nombre',)
    actions = ['export_as_csv']

class SitioReinoObservacionAdmin(admin.ModelAdmin, ExportCsvMixin):
    list_display = ('id', 'sitio', 'reino')
    list_display_links = ('sitio',)
    list_filter = ('sitio', 'reino')
    actions = ['export_as_csv']


class ArbolCaidoAdmin(admin.ModelAdmin, ExportCsvMixin):
    list_display = ('id', 'num_parcela', 'cuadrante')
    list_display_links = ('num_parcela',)
    actions = ['export_as_csv']


class ToconAdmin(admin.ModelAdmin, ExportCsvMixin):
    list_display = ('id', 'num_parcela', 'cuadrante')
    list_display_links = ('num_parcela',)
    actions = ['export_as_csv']


class CuadranteSEAdmin(admin.ModelAdmin, ExportCsvMixin):
    list_display = ('id', 'num_parcela')
    list_display_links = ('num_parcela',)
    actions = ['export_as_csv']


class SubparcelaAdmin(admin.ModelAdmin, ExportCsvMixin):
    list_display = ('id', 'num_parcela', 'orientacion')
    list_display_links = ('num_parcela',)
    actions = ['export_as_csv']


class VegetacionAdmin(admin.ModelAdmin, ExportCsvMixin):
    list_display = ('id', 'num_parcela')
    list_display_links = ('num_parcela',)
    actions = ['export_as_csv']

inecoaconbibo_admin_site.register(AreaProtegida, AreaProtegidaAdmin)
inecoaconbibo_admin_site.register(FincaPrivada, FincaPrivadaAdmin)
inecoaconbibo_admin_site.register(Reino, ReinoAdmin)
inecoaconbibo_admin_site.register(Observacion, ObservacionAdmin)
inecoaconbibo_admin_site.register(SitioReinoObservacion, SitioReinoObservacionAdmin)
inecoaconbibo_admin_site.register(Autor, AutorAdmin)
inecoaconbibo_admin_site.register(Sitio, SitioAdmin)
inecoaconbibo_admin_site.register(InfoPolitica, InfoPoliticaAdmin)
inecoaconbibo_admin_site.register(Parcela, ParcelaAdmin)
inecoaconbibo_admin_site.register(Especie, EspecieAdmin)
inecoaconbibo_admin_site.register(ArbolesPie, ArbolesPieAdmin)
inecoaconbibo_admin_site.register(ArbolCaido, ArbolCaidoAdmin)
inecoaconbibo_admin_site.register(Tocon, ToconAdmin )
inecoaconbibo_admin_site.register(CuadranteSE, CuadranteSEAdmin)
inecoaconbibo_admin_site.register(Subparcela, SubparcelaAdmin)
inecoaconbibo_admin_site.register(Vegetacion, VegetacionAdmin)
