from django.contrib import admin, messages
from .models import Publication, Project,ProjectContainer, ProjectFile, ResearchEquipment,ResearchEquipment_inventory,ResearchEquipment_calibration,ResearchEquipment_maintaince, Equipment_Category, Thesis, Patent,PatentChild, Add_Publication, JournalCover, Open_Thesis
from internal.models import Member
from home.models import Agency
from django import forms
from modules_webpage import add_publication_info, add_dois_scholar_info, set_slug
from django.http import HttpResponse
import csv
from django.utils.safestring import mark_safe
from django.db.models import Count, Q





@admin.action(description='Add selected publications')
def add_publication(modeladmin, request, queryset):
    add_publication_info(queryset)
    
@admin.action(description='Set Slug')
def add_slug(modeladmin, request, queryset):
    set_slug(queryset)
    
@admin.action(description='Add titles from Google Scholar for Author and Year')
def add_dois_scholar(modeladmin, request, queryset):
    add_dois_scholar_info(queryset)
    

class Add_PublicationAdmin(admin.ModelAdmin):
    readonly_fields = ['added','comment']
    list_filter = ['added','year']
    list_display = ['title', 'doi', 'year','author','added','doi_in_pubs']
    # actions = [add_publication, add_dois_scholar]
    actions = [add_publication]
    
admin.site.register(Add_Publication,Add_PublicationAdmin)

class Form_PublicationAdmin(forms.ModelForm):
    class Meta:
        widgets = {
            'title': forms.Textarea(attrs={'rows':3, 'cols':80}),
            'author_list': forms.Textarea(attrs={'rows':3, 'cols':80}),
            'abstract': forms.Textarea(attrs={'rows':5, 'cols':80}),
            'page' : forms.TextInput(attrs={'size': '5'}),
            'number' : forms.TextInput(attrs={'size': '5'}),
            'volume' : forms.TextInput(attrs={'size': '5'}),
        }




class JournalCoverAdmin(admin.StackedInline):
    model=JournalCover
    fieldsets = (
            (None, {
                'fields':('doi','url','cover_image')
            }),
    )
    min_num=0
    extra=0



class PublicationAdmin(admin.ModelAdmin):
    def get_actions(self, request):
        actions = super().get_actions(request)
        # Entferne die 'delete_selected'-Aktion aus den Aktionen
        del actions['delete_selected']
        return actions
    list_display = ('title', 'approved','cvselected','get_cover', 'pub_date', 'year','open_access','volume','journal_short','page','doi','get_cover_image','pub_type','created_date','arxiv_url')
    search_fields = ['title','doi','author_list','journal_short','journal']
    list_filter = ('approved', 'cvselected','group','pub_type','chair_pub','open_access')
    fieldsets = (
            (None, {
                'fields':('approved',('doi','pub_type'),'title','author_list','author','group','project','abstract','cvselected',
                 ('journal_short','journal','volume'),('page','year'),'pub_date','cover_image','chair_pub',
                 ('pdf_file','pdf_public'), 'arxiv_url',('open_access_url','open_access'),'slug'),
            }),
    )
    filter_horizontal=['author','group','project']
    date_hierarchy = 'pub_date'
    inlines = [JournalCoverAdmin]
    form=Form_PublicationAdmin
    actions=['export_as_docx']

    def get_queryset(self, request):
        qs = super().get_queryset(request)
        qs = qs.annotate(
            has_cover=Count(
                'journalCover_publication__cover_image', 
                filter=Q(journalCover_publication__cover_image__isnull=False)
            )
        )
        return qs

    def get_cover(self, obj):
        return obj.has_cover > 0
    get_cover.boolean = True
    get_cover.admin_order_field = 'has_cover'
    #def get_cover(self,obj):
    #    string =  ", ".join([c.__str__() for c in obj.journalCover_publication.all()])
    #    if string =='':
    #        return 0
    #    else:
    #        return 1

    def get_cover_image(self,obj):
        if obj.cover_image is not None and obj.cover_image!='':
            return True
        else:
            return False

    def export_as_docx(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={}.txt'.format(meta)
        for obj in queryset:
            for field in field_names:
                if field=='author_list':
                    authors= (getattr(obj, field))
                if field=='title':
                    title=(getattr(obj, field))
                if field=='journal_short':
                    journal_short=(getattr(obj, field))
                    if journal_short==None: journal_short=''
                if field=='volume':
                    volume=(getattr(obj, field))
                    if volume==None: volume=''
                if field=='pub_date':
                    pub_date=(getattr(obj, field)).year
                if field=='page':
                    page=(getattr(obj, field))
                    if page==None: page=''
            response.write(authors+'. '+title+'. '+journal_short+' '+str(volume)+' ('+str(pub_date)+') '+str(page)+'.\n\n\n')

        return response

    export_as_docx.short_description = "Export selected (format for IFWW)"
    get_cover_image.short_description = "Image?"
    get_cover.short_description = "On journal cover?"
    

    


class ProjectFileAdmin(admin.StackedInline):
    model = ProjectFile
    fieldsets = (
            (None, {
                'fields': (('file','copyright'),'title','description')
            }),
            )
    extra = 0


class ProjectAdmin(admin.ModelAdmin):
    list_display = ('name','project_acr','agency', 'project_id','start_date','end_date','funding_sum','get_project_member','slug')
    search_fields = ['name','project_acr','agency__name','project_member__last_name','project_member__given_name']
    fieldsets = (
            (None, {
                'fields': ('show_public','name',('superordinateProject'),'start_date','end_date','description','acknowledgement',('info_url','gepris_url','agency_url'),'project_member','group','slug')
            }),
            ('Project funding details', {
                'fields': ('agency','project_acr','project_id','funding_scheme','funding_id','funding_sum')
            }),
            ('Related ressources', {
                'fields': ('equipment',)
            }),
            ('Related publications', {
                'fields': ('publication',)
            }),
            ('Images', {
                'fields': (('image_project','copyright_image_project'),('image_descr','copyright_image_descr'))
            }),
        )    
    filter_horizontal=['project_member','group','equipment','publication']
    inlines = [ProjectFileAdmin]
    def get_project_member(self, obj):
        return ", ".join([c.__str__() for c in obj.project_member.all()])
    def get_actions(self, request):
        actions = super().get_actions(request)
        # Entferne die 'delete_selected'-Aktion aus den Aktionen
        del actions['delete_selected']
        return actions
    get_project_member.short_description='Project member'

class ProjectContainerAdmin(admin.ModelAdmin):
    list_display = ('name_german','name_english', 'project_id','start_date','end_date')
    fieldsets = ( 
            (None, {
                'fields': (('name_german','name_english'),'start_date','end_date','description','info_url')
            }),
            ('Project funding details', {
                'fields': ('project_id', 'agency','funding_acr','funding_scheme','funding_id','coordinated_by')
            }),
        ) 




class ResearchEquipment_maintainceAdmin(admin.StackedInline):
    model=ResearchEquipment_maintaince
    fieldsets = (
            (None, {
                'fields':('date',('works','notes'),'room','image','file')
            }),
    )
    min_num=0
    extra=0
    
class ResearchEquipment_calibrationAdmin(admin.StackedInline):
    model=ResearchEquipment_calibration
    fieldsets = (
            (None, {
                'fields':('date',('works','notes'),'room','image','file')
            }),
    )
    min_num=0
    extra=0

class ResearchEquipment_inventoryAdmin(admin.StackedInline):
    model=ResearchEquipment_inventory
    fieldsets = (
            (None, {
                'fields':('date',('works','notes'),'room','image')
            }),
    )
    readonly_fields = ('date',)
    min_num=0
    extra=0


class ResearchEquipmentAdmin(admin.ModelAdmin):
    readonly_fields = ['show_image']
    list_display = ('name','name_common','active','inventory_nr','room','get_responsible_person','get_categories','price','get_inventory','get_maintaince','get_calibration')
    search_fields = ['name','name_common','inventory_nr','responsible_person__last_name','responsible_person__given_name']
    fieldsets = (
            (None, {
                'fields': ('active',('name_common','name','inventory_nr'),('image','show_image'),('manufacturer','model'),('facility','partner','room'),'category',('description','technicalSpecs'),'device','maintenance',('info_url','techPortalTUD_url'),'price','group','project','responsible_person')
            }),
        )    
    filter_horizontal=['group','project','responsible_person','device','category']
    inlines = [ResearchEquipment_inventoryAdmin,ResearchEquipment_maintainceAdmin,ResearchEquipment_calibrationAdmin]
    def get_actions(self, request):
        actions = super().get_actions(request)
        # Entferne die 'delete_selected'-Aktion aus den Aktionen
        del actions['delete_selected']
        return actions
    def show_image(self, obj):
        if obj.image and hasattr(obj.image, 'url'):
            return mark_safe('<img src="{url}" height="128px" />'.format(
                url = obj.image.url,
                ))
        else:
            return ''

    def get_responsible_person(self, obj):
        return ", ".join([c.__str__() for c in obj.responsible_person.all()])

    def get_categories(self, obj):
        return ", ".join([c.__str__() for c in obj.category.all()])
    


    def get_inventory(self, obj):
        if obj.researchequipment_inventory.all():
            return str(obj.researchequipment_inventory.all()[0].date)
        else:
            return ''

    def get_maintaince(self, obj):
        if obj.researchequipment_maintaince.all():
            return str(obj.researchequipment_maintaince.all()[0].date)
        else:
            return ''
    def get_calibration(self, obj):
        if obj.researchequipment_calibration.all():
            return str(obj.researchequipment_calibration.all()[0].date)
        else:
            return ''
    
    get_responsible_person.short_description='Responsible person'
    get_categories.short_description='Category'
    get_inventory.short_description='Last date of inventory'
    get_maintaince.short_description='Last date of maintaince'
    get_calibration.short_description='Last date of calibration'
    show_image.short_description= 'Current photo'


class Equipment_CategoryAdmin(admin.ModelAdmin):
    list_display = ('name','order_index')
    search_fields = ['name']
    fieldsets = (
            (None, {
                'fields': ('name','equipment','order_index')
            }),
        )
    filter_horizontal=['equipment']


class ThesisAdmin(admin.ModelAdmin):
    list_display = ('title', 'display_authors','start_date', 'end_date','def_date','slub')
    list_filter = ('pub_type','def_date','group')
    fieldsets = (
            (None, {
                'fields':('pub_type', 'slug', ('start_date', 'end_date','def_date'),('university','faculty'),'title',('author_new','author_manual'),('supervisor','supervisor_manual'),('reviewer','reviewer_manual'),'function_cuniberti','grade','group','abstract','cover_image','chair_pub','project','pdf_file','slub','qucosa','rigorosum_notes')
            }),
    )
    filter_horizontal=['author_new','supervisor','reviewer','project','group']
    def display_authors(self, obj):
        return ", ".join(str(author) for author in obj.author_new.all())
    display_authors.short_description = 'authors'
    
    def get_actions(self, request):
        actions = super().get_actions(request)
        # Entferne die 'delete_selected'-Aktion aus den Aktionen
        del actions['delete_selected']
        return actions
    
    @admin.action(description="create slugs")
    def regenerate_slugs(self, request, queryset):
        counter = 0
        for thesis in queryset:
            if not thesis.slug:          
                thesis.save()
                counter += 1
        self.message_user(
            request,
            f"{counter} slugs created",
            level=messages.SUCCESS
        )
    # actions=[regenerate_slugs]
    #def has_delete_permission(self, request, obj=None):
    #    # Disable delete
    #   return False

class OpenThesisAdmin(admin.ModelAdmin):
    list_display = ['title','public','get_supervisor','get_pub_type','theory', 'experimental']
    # list_filter = ('pub_type','pub_date','group')
    fieldsets = (
            (None, {
                'fields':(('theory','experimental'),'publication_type','public','title','supervisor','abstract','pdf_file',('cover_image','copyright'),'project', 'group','publication')
            }),
    )
    filter_horizontal=['supervisor','project','group','publication']
    
    def get_supervisor(self, obj):
        return ", ".join([c.__str__() for c in obj.supervisor.all()])
    get_supervisor.short_description='Supervisor'
    
    def get_actions(self, request):
        actions = super().get_actions(request)
        # Entferne die 'delete_selected'-Aktion aus den Aktionen
        del actions['delete_selected']
        return actions
    
    def get_pub_type(self, obj):
        return ", ".join([c.__str__() for c in obj.publication_type.all()])
    get_supervisor.short_description='Type'

class PatentChildAdmin(admin.StackedInline):
    model=PatentChild
    fieldsets = (
            (None, {
                'fields':('number','pub_type','app_date','pub_date','issue_date','country','url','pdf_file')
            }),
    )
    min_num=1
    extra=0



class PatentAdmin(admin.ModelAdmin):
    list_display = ('title_german', 'url_family','get_patents','slug')
    list_filter = ('group',)
    fieldsets = (
            (None, {
                'fields':(('cvselected','chair_pub'),('title_german','title_english'),'inventor','owner','abstract_german','abstract_english','application_fields','cover_image','project','pdf_file','slug')
            }),
             ('References', {
                'fields':(('url_family','google_patents','orbit'))
            }),
    )
    def get_actions(self, request):
        actions = super().get_actions(request)
        # Entferne die 'delete_selected'-Aktion aus den Aktionen
        del actions['delete_selected']
        return actions


    '''
    def add_slug(modeladmin, request, queryset):
        set_slug(queryset)
    actions=[add_slug]
    add_slug.short_description='Set Slug'
    '''
    
    filter_horizontal=['project','group','inventor','owner']
    inlines = [PatentChildAdmin]
    def get_patents(self, obj):
        return ", ".join([c.number for c in obj.patentchild_patent.all()])
    get_patents.short_description = 'Patent-IDs'
    class Meta:
        model = Patent
    

# Register the admin class with the associated model

admin.site.register(Publication, PublicationAdmin)
admin.site.register(Project, ProjectAdmin)
admin.site.register(ProjectContainer, ProjectContainerAdmin)
admin.site.register(ResearchEquipment, ResearchEquipmentAdmin)
admin.site.register(Equipment_Category, Equipment_CategoryAdmin)
admin.site.register(Thesis, ThesisAdmin)
admin.site.register(Open_Thesis, OpenThesisAdmin)
admin.site.register(Patent, PatentAdmin)

