from django.contrib import admin
from django.shortcuts import render, redirect
from django.urls import path
from .models import Group, GroupTopic, Member, Device, Postnominal, Halslide, Member_tac, CV, Shared_document,Shared_document_further_files, Researchslide, Teachingslide
from modules_webpage import create_publication_include, pdflatex_cv
from django.utils.safestring import mark_safe
from .forms import UpdateIntegerFieldForm
from django.urls import reverse
from django.utils.html import format_html


@admin.register(CV)
class CVAdmin(admin.ModelAdmin):
    @admin.action(description='update publications for CV')
    def publication_include(modeladmin, request, queryset):
        create_publication_include(queryset)
        
    @admin.action(description='Update PDF from TeX file')
    def create_PDF(modeladmin, request, queryset):
        pdflatex_cv(queryset)
    actions = [publication_include,create_PDF]
    
    def has_delete_permission(self, request, obj=None):
        # Disable delete
        return False
        
    def has_add_permission(self, request, obj=None):
        # Disable add permission
        return False
    
    readonly_fields = ["pdf_file",'pdf_short','log_file']


@admin.register(Halslide)
class HalslideAdmin(admin.ModelAdmin):
    change_list_template='halway__change_list_form.html'
    list_display = ('name','date', 'time', 'show')
    view_on_site = True
    actions = ['update_display_time']

    def update_display_time(self, request, queryset):
        if 'apply' in request.POST:
            form = UpdateIntegerFieldForm(request.POST)
            if form.is_valid():
                new_value = form.cleaned_data['new_integer_value']
                queryset.update(time=new_value)
                self.message_user(request, f"Updated display time value to {new_value} seconds for selected slides.")
                return redirect(request.get_full_path())
            else:
                self.message_user(request, "The form is not valid.")
        else:
            form = UpdateIntegerFieldForm()
            context = {
                'form': form,
                'slides': queryset,
                'action_checkbox_name': admin.helpers.ACTION_CHECKBOX_NAME,
            }
            return render(request, 'admin/update_display_time.html', context)

    update_display_time.short_description = "Update display time for selected slides"

    def get_urls(self):
        urls = super().get_urls()
        custom_urls = [
            path('update-integer/', self.admin_site.admin_view(self.update_display_time), name='update-integer'),
        ]
        return custom_urls + urls
    
    def changelist_view(self, request, extra_context=None):
        extra_context = extra_context or {}
        extra_context['update_integer_form'] = UpdateIntegerFieldForm()
        return super().changelist_view(request, extra_context)
    

@admin.register(Researchslide)
class ResslideAdmin(admin.ModelAdmin):
    change_list_template='resslides__change_list_form.html'
    list_display = ('name','date', 'time', 'show')
    view_on_site = True
    actions = ['update_display_time']

    def update_display_time(self, request, queryset):
        if 'apply' in request.POST:
            form = UpdateIntegerFieldForm(request.POST)
            if form.is_valid():
                new_value = form.cleaned_data['new_integer_value']
                queryset.update(time=new_value)
                self.message_user(request, f"Updated display time value to {new_value} seconds for selected slides.")
                return redirect(request.get_full_path())
            else:
                self.message_user(request, "The form is not valid.")
        else:
            form = UpdateIntegerFieldForm()
            context = {
                'form': form,
                'slides': queryset,
                'action_checkbox_name': admin.helpers.ACTION_CHECKBOX_NAME,
            }
            return render(request, 'admin/update_display_time.html', context)

    update_display_time.short_description = "Update display time for selected slides"

    def get_urls(self):
        urls = super().get_urls()
        custom_urls = [
            path('update-integer/', self.admin_site.admin_view(self.update_display_time), name='update-integer'),
        ]
        return custom_urls + urls
    
    def changelist_view(self, request, extra_context=None):
        extra_context = extra_context or {}
        extra_context['update_integer_form'] = UpdateIntegerFieldForm()
        return super().changelist_view(request, extra_context)
    

@admin.register(Teachingslide)
class TsslideAdmin(admin.ModelAdmin):
    change_list_template='tsslides__change_list_form.html'
    list_display = ('name','date', 'time', 'show')
    view_on_site = True
    actions = ['update_display_time']

    def update_display_time(self, request, queryset):
        if 'apply' in request.POST:
            form = UpdateIntegerFieldForm(request.POST)
            if form.is_valid():
                new_value = form.cleaned_data['new_integer_value']
                queryset.update(time=new_value)
                self.message_user(request, f"Updated display time value to {new_value} seconds for selected slides.")
                return redirect(request.get_full_path())
            else:
                self.message_user(request, "The form is not valid.")
        else:
            form = UpdateIntegerFieldForm()
            context = {
                'form': form,
                'slides': queryset,
                'action_checkbox_name': admin.helpers.ACTION_CHECKBOX_NAME,
            }
            return render(request, 'admin/update_display_time.html', context)

    update_display_time.short_description = "Update display time for selected slides"

    def get_urls(self):
        urls = super().get_urls()
        custom_urls = [
            path('update-integer/', self.admin_site.admin_view(self.update_display_time), name='update-integer'),
        ]
        return custom_urls + urls
    
    def changelist_view(self, request, extra_context=None):
        extra_context = extra_context or {}
        extra_context['update_integer_form'] = UpdateIntegerFieldForm()
        return super().changelist_view(request, extra_context)
    
    

@admin.register(Device)
class DeviceAdmin(admin.ModelAdmin):
    list_display = ('name','member', 'room','year','defect','usage','chair_task','inventory_number','price')
    search_fields = ['member__given_name','member__last_name', 'name','room__name', 'room__building__short_name','inventory_number']
    
    fieldsets = (
            ('General',{
                'fields':(('defect'),
                ('usage','chair_task'),
                ('inventory_number','serial_number'),
                ('name','year','price'), 
                ('description','history'))
                }),
            ('References',{    
                'fields':('member','room','research_eq')
                # ,'additional_info' 
            }),
    )

    filter_horizontal=['research_eq']
    
    def has_delete_permission(self, request, obj=None):
        # Disable delete
        return False
    
    
class PostnominalAdmin(admin.StackedInline):
    model = Postnominal
    extra = 0
    min_num = 1

class Member_tacAdmin(admin.StackedInline):
    model = Member_tac
    fieldsets = (
            ('General',{
                'fields':('title','date_new','slides','slides_link','document', 'document_link', 'document_2', 'document_2_link', 'document_3', 'document_3_link')
                }),)    
    readonly_fields = ('slides_link','document_link', 'document_2_link', 'document_3_link')
    extra = 0
    min_num = 1

    def slides_link(self, obj):
        if obj.slides and hasattr(obj.slides, 'name'):
            protected_url = reverse('admin_protected_file', args=(obj.slides.name,))
            return format_html('<a href="{}" target="_blank">Download slides</a>', protected_url)
        return "-"
    slides_link.short_description = "Slides (protected)"

    def document_link(self, obj):
        if obj.document and hasattr(obj.document, 'name'):
            protected_url = reverse('admin_protected_file', args=(obj.document.name,))
            return format_html('<a href="{}" target="_blank">Download document 1</a>', protected_url)
        return "-"
    document_link.short_description = "Document 1 (protected)"

    def document_2_link(self, obj):
        if obj.document_2 and hasattr(obj.document_2, 'name'):
            protected_url = reverse('admin_protected_file', args=(obj.document_2.name,))
            return format_html('<a href="{}" target="_blank">Download document 2</a>', protected_url)
        return "-"
    document_2_link.short_description = "Document 2 (protected)"

    def document_3_link(self, obj):
        if obj.document_3 and hasattr(obj.document_3, 'name'):
            protected_url = reverse('admin_protected_file', args=(obj.document_3.name,))
            return format_html('<a href="{}" target="_blank">Download document 3</a>', protected_url)
        return "-"
    document_3_link.short_description = "Document 3 (protected)"

@admin.register(Member)
class MemberAdmin(admin.ModelAdmin):
    list_display = ('given_name', 'last_name','title','status','entry_date','exit_date','job_mail','get_room','get_projects','active','visitor', 'show_public','private_mail','get_tac','get_devices')
    list_filter = ('active', 'visitor','group','status')
    search_fields = ['given_name','given_name_alt','last_name','last_name_alt','project_list__project_acr']
    readonly_fields=['show_image']
    fieldsets = (
            ('General',{
                'fields':(('show_public','meta_tags'),('given_name','given_name_alt'),('last_name','last_name_alt'), ('image','show_image'),('title','prenominal'),'education', 'country', ('status','gender','birth_day'),
                'bio','job_phone','job_mail','room',
                ('active','visitor','extern_related'),('entry_date','exit_date'), ('group','groupLeading'))
                }),
            ('Internal',{    
                'fields':(('thesis_defense'),'slug')
            }),
            ('External information',{    
                'fields':(('status_extern','organisation_extern','url_extern','url_label_extern'))
            }),
            ('References',{    
                'fields':('tud_fis','gepris','linkedin','xing','orcid','researchgate','researcher_id','research','googlescholar', 'scopus','adscientificindex','web_of_science','scholar_gps','github','twitter','bluesky','instagram','wiki')
                # ,'additional_info' 
            }),
            ('Presentations',{    
                'fields':(('presentor','author'))
                # ,'additional_info' 
            }),
            ('Related',{    
                'fields':('publication','project_list','research_eq','news')
                # ,'additional_info' 
            }),

            ('Private info',{    
                'fields':(('priv_street','priv_streetNumber'),('priv_postalcode','priv_city','priv_country'),'priv_matriculationnumber','private_mobile','private_mail','url_private','private_info')
            }),

    )
    filter_horizontal=['room','group','groupLeading','publication','project_list','research_eq','news','presentor','author']
    ordering = ['-entry_date']
    inlines = [PostnominalAdmin,Member_tacAdmin] 
    #prepopulated_fields={'slug': ('given_name',)}

    def show_image(self, obj):
        return mark_safe('<img src="{url}" height="128px" />'.format(
            url = obj.image.url,
            ))
    def get_room(self, obj):
        return ", ".join([c.__str__() for c in obj.room.all()])
    def get_devices(self, obj):
        return ", ".join([c.__str__() for c in obj.device_set.all()])
    def get_tac(self, obj):
        return ", ".join([c.__str__() for c in obj.member_tac_set.all()])
    def get_projects(self, obj):
        out_ls=[]
        if obj.last_name =='Cuniberti':
            out_ls.append('all')
        else:
            for c,p in enumerate(obj.project_list.all()):
                #if c==5: break
                # out_ls.append(p.project_acr+' ('+p.agency.name+')')
                out_ls.append(p.project_acr)
        return ', '.join(out_ls)
    def has_delete_permission(self, request, obj=None):
        # Disable delete
        return False
    show_image.short_description= 'Current photo'
    get_devices.short_description = 'Devices'
    get_devices.admin_order_field = 'device__name'
    get_room.short_description='Room'
    get_tac.short_description='TAC meeting'
    get_tac.admin_order_field = 'member_tac__date_new'
    get_projects.short_description='Projects'
    



class GroupTopicAdmin(admin.StackedInline):
    model = GroupTopic
    extra = 0
    min_num = 1
    
@admin.register(Group)
class GroupAdmin(admin.ModelAdmin):
    list_display = ('name','show_public','get_group_leader','group_type','active','internal_group')
    fieldsets = (
            (None, {
                'fields': ('show_public','name','group_leader','group_member','publication','project','thesis','patent',
                'group_type',
                'active',
                'internal_group',('image','copyright'),'slug')
            }),
            )
    filter_horizontal=['group_leader','group_member','publication','project','thesis','patent']
    inlines = [GroupTopicAdmin]    
    def get_group_leader(self, obj):
        return ", ".join([c.__str__() for c in obj.group_leader.all()])
    get_group_leader.short_description='Group leader'
    def has_delete_permission(self, request, obj=None):
        # Disable delete
        return False
    class Meta:
        model = Group

class Shared_document_further_filesAdmin(admin.StackedInline):
    model = Shared_document_further_files
    fieldsets = (
            ('General',{
                'fields':('order_index','description',('pdf_file','pdf_file_to_download'),('editable_file','editable_file_to_download'),('zip_file','zip_file_to_download'),'copyright')
                }),)
    extra = 0
    min_num = 0


@admin.register(Shared_document)
class Shared_documentAdmin(admin.ModelAdmin):
    change_list_template='shared_document__change_list_form.html'
    list_display = ('name','copyright')
    fieldsets = (
            (None, {
                'fields': ('name','description',('pdf_file','pdf_file_to_download'),('editable_file','editable_file_to_download'),('zip_file','zip_file_to_download'),'copyright','video_file')
            }),
            )
    inlines = [Shared_document_further_filesAdmin] 
