import json

from django.contrib import admin
from django.utils.html import format_html

from .models import (
    AdminTripAction,
    Bid,
    Conversation,
    CountryBoundary,
    FreightRoute,
    Message,
    Notification,
    PODPhoto,
    ProofOfDelivery,
    Shipper,
    Shipment,
    Trip,
    TripLocation,
    Zone,
)


@admin.register(Shipper)
class ShipperAdmin(admin.ModelAdmin):
    list_display = ('name', 'email', 'company', 'created_at')


@admin.register(Shipment)
class ShipmentAdmin(admin.ModelAdmin):
    list_display = ('id', 'unique_id', 'shipper', 'pickup_address', 'delivery_address', 'local', 'country_to_country', 'status', 'created_at')
    list_filter = ('status', 'local', 'country_to_country')
    readonly_fields = ('price_breakdown',)


@admin.register(Bid)
class BidAdmin(admin.ModelAdmin):
    list_display = ('id', 'shipment', 'transporter', 'amount', 'status', 'created_at')
    list_filter = ('status',)


@admin.register(Trip)
class TripAdmin(admin.ModelAdmin):
    list_display = ('id', 'shipment', 'transporter', 'status', 'created_at')
    list_filter = ('status',)


@admin.register(TripLocation)
class TripLocationAdmin(admin.ModelAdmin):
    list_display = ('id', 'trip', 'lat', 'lon', 'recorded_at')


@admin.register(Conversation)
class ConversationAdmin(admin.ModelAdmin):
    list_display = ('id', 'trip', 'created_at')


@admin.register(Message)
class MessageAdmin(admin.ModelAdmin):
    list_display = ('id', 'conversation', 'sender', 'message_type', 'created_at')


@admin.register(ProofOfDelivery)
class ProofOfDeliveryAdmin(admin.ModelAdmin):
    list_display = ('id', 'trip', 'receiver_name', 'delivered_at', 'created_at')


@admin.register(PODPhoto)
class PODPhotoAdmin(admin.ModelAdmin):
    list_display = ('id', 'pod', 'created_at')


@admin.register(AdminTripAction)
class AdminTripActionAdmin(admin.ModelAdmin):
    list_display = ('id', 'trip', 'performed_by', 'previous_status', 'new_status', 'created_at')
    list_filter = ('new_status',)
    readonly_fields = ('trip', 'performed_by', 'previous_status', 'new_status', 'justification', 'created_at')


@admin.register(Notification)
class NotificationAdmin(admin.ModelAdmin):
    list_display = ('id', 'title', 'type', 'user', 'seen', 'created_at')
    list_filter = ('type', 'seen')
    search_fields = ('title', 'message', 'user__email', 'user__username')


@admin.register(Zone)
class ZoneAdmin(admin.ModelAdmin):
    list_display = ('country_code', 'radius_km', 'rate_per_km', 'allow_return_trips', 'created_at')
    list_filter = ('allow_return_trips',)
    search_fields = ('country_code',)


@admin.register(CountryBoundary)
class CountryBoundaryAdmin(admin.ModelAdmin):
    list_display = ('country_code', 'country_name')
    search_fields = ('country_code', 'country_name')
    readonly_fields = ('geojson_pretty',)
    fields = ('country_code', 'country_name', 'geojson_pretty')

    @admin.display(description='GeoJSON')
    def geojson_pretty(self, obj):
        if not obj or obj.geojson is None:
            return '—'
        pretty = json.dumps(obj.geojson, indent=2)
        return format_html(
            '<pre style="max-height:28rem;overflow:auto;white-space:pre-wrap;">{}</pre>',
            pretty,
        )


@admin.register(FreightRoute)
class FreightRouteAdmin(admin.ModelAdmin):
    list_display = (
        'origin_display',
        'destination_display',
        'min_freight',
        'currency',
        'updated_at',
    )
    list_filter = ('origin_country_code', 'destination_country_code', 'currency')
    search_fields = ('origin_country_code', 'destination_country_code')
    ordering = ('origin_country_code', 'destination_country_code')

    @admin.display(description='Origin', ordering='origin_country_code')
    def origin_display(self, obj):
        from core.countries import country_name_for_code
        name = country_name_for_code(obj.origin_country_code) or obj.origin_country_code
        return f'{name} ({obj.origin_country_code})'

    @admin.display(description='Destination', ordering='destination_country_code')
    def destination_display(self, obj):
        from core.countries import country_name_for_code
        name = country_name_for_code(obj.destination_country_code) or obj.destination_country_code
        return f'{name} ({obj.destination_country_code})'