from django.contrib import admin
import record.models as models


@admin.register(models.SubmissionType)
class SubmissionTypeAdmin(admin.ModelAdmin):
    list_display = ("name", "rank", "created_at")
    list_editable = ("rank",)
    search_fields = ("name",)
    ordering = ("rank", "name")


@admin.register(models.CommodityCategory)
class CommodityCategoryAdmin(admin.ModelAdmin):
    list_display = ("name", "created_at")
    search_fields = ("name",)


@admin.register(models.CommodityType)
class CommodityTypeAdmin(admin.ModelAdmin):
    list_display = ("name", "category", "created_at")
    list_filter = ("category",)
    search_fields = ("name", "category__name")


@admin.register(models.UnitOfMeasurement)
class UnitOfMeasurementAdmin(admin.ModelAdmin):
    list_display = ("name", "code", "dimension", "created_at")
    list_filter = ("dimension",)
    search_fields = ("name", "code")


@admin.register(models.UnitConversion)
class UnitConversionAdmin(admin.ModelAdmin):
    list_display = ("from_unit", "to_unit", "factor", "created_at")
    list_filter = ("from_unit__dimension",)
    search_fields = (
        "from_unit__name",
        "from_unit__code",
        "to_unit__name",
        "to_unit__code",
    )


@admin.register(models.SubmissionStatus)
class SubmissionStatusAdmin(admin.ModelAdmin):
    list_display = ("name", "code", "created_at")
    search_fields = ("name", "code")

    def get_readonly_fields(self, request, obj=None):
        if obj:  # editing an existing object
            return self.readonly_fields + ('code',)
        return self.readonly_fields


@admin.register(models.ImportSubmission)
class ImportSubmissionAdmin(admin.ModelAdmin):
    list_display = (
        "tracking_code",
        "refrence_no",
        "commodity_type",
        "import_date",
        "approval_no",
        "base_amount",
        "amount_in_npr",
        "currency",
        "submitted_at",
    )
    list_filter = ("status", "commodity_type", "submission_type")
    search_fields = (
        "tracking_code",
        "refrence_no",
        "approval_no",
        "importer_name",
        "exporter_name",
    )
    date_hierarchy = "submitted_at"
    autocomplete_fields = ("created_by", "updated_by")
    readonly_fields = ("tracking_code", "refrence_no")


@admin.register(models.CollectionCategory)
class CollectionCategoryAdmin(admin.ModelAdmin):
    list_display = ("name", "created_at")
    search_fields = ("name",)


@admin.register(models.CollectionType)
class CollectionTypeAdmin(admin.ModelAdmin):
    list_display = ("name", "category", "created_at")
    list_filter = ("category",)
    search_fields = ("name", "category__name")


@admin.register(models.MetadataDeletionRequest)
class MasterDataDeletionRequestAdmin(admin.ModelAdmin):
    list_display = (
        "target_type",
        "target_name",
        "status",
        "requested_by",
        "reviewed_by",
        "created_at",
        "reviewed_at",
    )
    list_filter = ("target_type", "status")
    search_fields = (
        "target_name",
        "reason",
        "review_note",
        "requested_by__name",
        "requested_by__email",
        "reviewed_by__name",
        "reviewed_by__email",
    )


@admin.register(models.RevenueFineSubmission)
class RevenueFineSubmissionAdmin(admin.ModelAdmin):
    list_display = (
        "tracking_code",
        "refrence_no",
        "collection_type",
        "revenue_date",
        "base_amount",
        "amount_in_npr",
        "currency",
        "payment_refrence",
        "submitted_at",
    )
    list_filter = ("status", "collection_type")
    search_fields = ("tracking_code", "refrence_no", "payment_refrence")
    date_hierarchy = "submitted_at"
    autocomplete_fields = ("created_by", "updated_by")
    readonly_fields = ("tracking_code", "refrence_no")


@admin.register(models.ExportSubmission)
class ExportSubmissionAdmin(admin.ModelAdmin):
    list_display = (
        "tracking_code",
        "refrence_no",
        "commodity_type",
        "export_date",
        "destination_country",
        "base_amount",
        "amount_in_npr",
        "currency",
        "quantity",
        "submitted_at",
    )
    list_filter = ("status", "commodity_type", "destination_country")
    search_fields = (
        "tracking_code",
        "refrence_no",
        "destination_country",
        "exporter_name",
    )
    date_hierarchy = "submitted_at"
    autocomplete_fields = ("created_by", "updated_by")
    readonly_fields = ("tracking_code", "refrence_no")


@admin.register(models.HealthInspectionSubmission)
class HealthInspectionSubmissionAdmin(admin.ModelAdmin):
    list_display = (
        "tracking_code",
        "refrence_no",
        "commodity_type",
        "health_date",
        "inspection_type",
        "result",
        "submitted_at",
    )
    list_filter = ("status", "commodity_type", "result")
    search_fields = ("tracking_code", "refrence_no", "inspection_type", "product_name")
    date_hierarchy = "submitted_at"
    autocomplete_fields = ("created_by", "updated_by")
    readonly_fields = ("tracking_code", "refrence_no")


@admin.register(models.DestructionSubmission)
class DestructionSubmissionAdmin(admin.ModelAdmin):
    list_display = (
        "tracking_code",
        "refrence_no",
        "commodity_type",
        "destruction_method",
        "destruction_date",
        "submitted_at",
    )
    list_filter = ("status", "commodity_type", "destruction_method")
    search_fields = ("tracking_code", "refrence_no", "destruction_method")
    date_hierarchy = "submitted_at"
    autocomplete_fields = ("created_by", "updated_by")
    readonly_fields = ("tracking_code", "refrence_no")


@admin.register(models.Submission)
class SubmissionAdmin(admin.ModelAdmin):
    list_display = (
        "tracking_code",
        "refrence_no",
        "submission_type",
        "status",
        "submitted_at",
    )
    list_filter = ("submission_type", "status", "checkpoint")
    search_fields = ("tracking_code", "refrence_no")
    date_hierarchy = "submitted_at"
    readonly_fields = ("tracking_code", "refrence_no")


@admin.register(models.Document)
class DocumentAdmin(admin.ModelAdmin):
    list_display = ("submission", "uploaded_by", "is_verified", "created_at")
    list_filter = ("is_verified",)
    search_fields = ("submission__tracking_code", "remarks")


@admin.register(models.SubmissionStatusHistory)
class SubmissionStatusHistoryAdmin(admin.ModelAdmin):
    list_display = (
        "submission",
        "from_status",
        "to_status",
        "updated_by",
        "created_at",
    )
    list_filter = ("from_status", "to_status")
    search_fields = ("submission__tracking_code",)
