from django.contrib import admin

from shared.admin import MarkdownxGuardedModelAdmin

from .forms import (
    ContractAdminForm,
    SigneeAdminForm,
)
from .models import (
    Contract,
    Contractee,
    ContracteeRepresentative,
    ContracteeSignature,
    ContractFile,
    ContractFilingArea,
    ContractIntent,
    ContractIssue,
    ContractType,
    Signee,
    SigneeRepresentative,
    SigneeSignature,
)


class IndexHiddenModelAdmin(MarkdownxGuardedModelAdmin):
    def has_module_permission(self, request):
        return False


# BEGIN Contracts


class ContracteeSignatureInline(admin.TabularInline):
    model = ContracteeSignature
    extra = 0


class SigneeSignatureInline(admin.TabularInline):
    model = SigneeSignature
    extra = 0


class ContractFileInline(admin.TabularInline):
    model = ContractFile
    extra = 0


class ContractIntentInline(admin.TabularInline):
    model = ContractIntent
    extra = 0


class ContractAdmin(MarkdownxGuardedModelAdmin):
    form = ContractAdminForm

    readonly_fields = ("created_by",)

    inlines = (
        ContracteeSignatureInline,
        SigneeSignatureInline,
        ContractFileInline,
        ContractIntentInline,
    )

    def get_fields(self, request, obj=None):
        fields = [
            "created_by",
            "types",
            "valid_start_date",
            "valid_end_date",
            "legal_state",
            "public_state",
            "paper_form_state",
            "publishing_rejection_comment",
            "tender_url",
            "identifier",
            "issues",
            "notes",
            "summary",
            "primary_contract",
            "agreement_url",
            "filing_area",
            "expected_cost_year",
            "expected_cost_month",
            "expected_cost_hour",
        ]

        if request.user.is_superuser or request.user.has_perm("approve", self):
            fields.append("is_approved")

        return fields

    def save_model(self, request, obj, form, change) -> None:
        if obj.created_by is None:
            obj.created_by = request.user

        super().save_model(request, obj, form, change)


# END Contracts

# BEGIN Signing parties


class SigneeRepresentativeInline(admin.TabularInline):
    model = SigneeRepresentative
    extra = 0


class SigneeAdmin(MarkdownxGuardedModelAdmin):
    form = SigneeAdminForm

    inlines = (SigneeRepresentativeInline,)


class ContracteeRepresentativeInline(admin.TabularInline):
    model = ContracteeRepresentative
    extra = 0


class ContracteeAdmin(MarkdownxGuardedModelAdmin):
    inlines = (ContracteeRepresentativeInline,)


# END Signing parties


for model in (
    SigneeSignature,
    ContracteeSignature,
    SigneeRepresentative,
    ContracteeRepresentative,
    ContractType,
    ContractIntent,
):
    admin.site.register(model, IndexHiddenModelAdmin)

for model in (
    ContractIssue,
    ContractFilingArea,
):
    admin.site.register(model, MarkdownxGuardedModelAdmin)

admin.site.register(Signee, SigneeAdmin)
admin.site.register(Contractee, ContracteeAdmin)

admin.site.register(Contract, ContractAdmin)