__copyright__ = "Copyright © Stichting SciPost (SciPost Foundation)"
__license__ = "AGPL v3"


from django.contrib import admin

from .models import (
    College,
    Fellowship,
    PotentialFellowship,
    PotentialFellowshipEvent,
    FellowshipNomination,
    FellowshipNominationEvent,
    FellowshipNominationComment,
    FellowshipNominationVotingRound,
    FellowshipNominationVote,
    FellowshipNominationDecision,
    FellowshipInvitation,
)


admin.site.register(College)


def fellowhip_is_active(fellowship):
    return fellowship.is_active()


class FellowshipAdmin(admin.ModelAdmin):
    search_fields = ["contributor__user__last_name", "contributor__user__first_name"]
    list_display = (
        "__str__",
        "college",
        "status",
        "senior",
        fellowhip_is_active,
    )
    list_filter = ("status",)
    fellowhip_is_active.boolean = True
    date_hierarchy = "created"
    autocomplete_fields = [
        "contributor",
    ]


admin.site.register(Fellowship, FellowshipAdmin)


class PotentialFellowshipEventInline(admin.TabularInline):
    model = PotentialFellowshipEvent
    autocomplete_fields = [
        "potfel",
        "noted_by",
    ]


class PotentialFellowshipAdmin(admin.ModelAdmin):
    inlines = [
        PotentialFellowshipEventInline,
    ]
    list_display = ["__str__", "college", "status"]
    search_fields = ["profile__last_name", "profile__first_name"]
    autocomplete_fields = [
        "profile",
        "in_agreement",
        "in_abstain",
        "in_disagreement",
    ]


admin.site.register(PotentialFellowship, PotentialFellowshipAdmin)


class FellowshipNominationEventInline(admin.TabularInline):
    model = FellowshipNominationEvent
    extra = 0


class FellowshipNominationCommentInline(admin.TabularInline):
    model = FellowshipNominationComment
    extra = 0


class FellowshipNominationVotingRoundInline(admin.TabularInline):
    model = FellowshipNominationVotingRound
    extra = 0


class FellowshipNominationDecisionInline(admin.TabularInline):
    model = FellowshipNominationDecision
    extra = 0


class FellowshipInvitationInline(admin.TabularInline):
    model = FellowshipInvitation
    extra = 0


class FellowshipNominationAdmin(admin.ModelAdmin):
    inlines = [
        FellowshipNominationEventInline,
        FellowshipNominationCommentInline,
        FellowshipNominationVotingRoundInline,
        FellowshipInvitationInline,
    ]
    list_filter = ["college__name"]
    list_display = ["profile", "college", "nominated_on"]
    search_fields = ["college__name", "profile__last_name", "profile__first_name"]
    autocomplete_fields = ["profile", "nominated_by", "fellowship"]


admin.site.register(FellowshipNomination, FellowshipNominationAdmin)


class FellowshipNominationVoteInline(admin.TabularInline):
    model = FellowshipNominationVote
    extra = 0

    # Filter "fellow" field to only those who are eligible to vote
    def formfield_for_foreignkey(self, db_field, request, **kwargs):
        if db_field.name == "fellow":
            kwargs["queryset"] = FellowshipNominationVotingRound.objects.get(
                pk=request.resolver_match.kwargs["object_id"]
            ).eligible_to_vote.all()
        return super().formfield_for_foreignkey(db_field, request, **kwargs)


class FellowshipNominationVotingRoundAdmin(admin.ModelAdmin):
    model = FellowshipNominationVotingRound
    inlines = [
        FellowshipNominationVoteInline,
        FellowshipNominationDecisionInline,
    ]
    search_fields = [
        "nomination__profile__last_name",
        "nomination__profile__first_name",
        "nomination__college__name",
    ]
    list_display = [
        "nomination",
        "voting_opens",
        "voting_deadline",
        "is_open_checkmark",
        "decision__outcome",
    ]
    autocomplete_fields = [
        "nomination",
        "eligible_to_vote",
    ]
    list_filter = ("decision__outcome",)

    def decision__outcome(self, obj):
        return obj.decision.get_outcome_display()

    @admin.display(
        boolean=True,
        description="Open",
    )
    def is_open_checkmark(self, obj):
        return obj.is_open


admin.site.register(
    FellowshipNominationVotingRound, FellowshipNominationVotingRoundAdmin
)