"""
Django Admin Configuration for Business Models
"""

from django.contrib import admin
from .models import (
    Category, SubCategory, Business, BusinessImage, BusinessVideo,
    Service, ServiceImage, Employee, PastExperience, PastExperienceImage,
    Review, ReviewImage, ChatRoom, ChatMessage, Notification, BusinessHours,
    Feedback, BusinessMembership, BusinessBranch, Post, Offer, LeadEvent, ContactRequest
)


@admin.register(Category)
class CategoryAdmin(admin.ModelAdmin):
    list_display = ['name', 'is_active', 'subcategory_count', 'created_at']
    list_filter = ['is_active', 'created_at']
    search_fields = ['name', 'description']
    ordering = ['name']

    def subcategory_count(self, obj):
        return obj.sub_categories.count()
    subcategory_count.short_description = 'Sub-Categories'


@admin.register(SubCategory)
class SubCategoryAdmin(admin.ModelAdmin):
    list_display = ['name', 'category', 'is_active', 'business_count', 'created_at']
    list_filter = ['is_active', 'category', 'created_at']
    search_fields = ['name', 'description', 'category__name']
    ordering = ['category__name', 'name']

    def business_count(self, obj):
        return obj.businesses.count()
    business_count.short_description = 'Businesses'


class BusinessImageInline(admin.TabularInline):
    model = BusinessImage
    extra = 1


class BusinessVideoInline(admin.TabularInline):
    model = BusinessVideo
    extra = 1


class ServiceInline(admin.TabularInline):
    model = Service
    extra = 1


class EmployeeInline(admin.TabularInline):
    model = Employee
    extra = 1


class BusinessHoursInline(admin.TabularInline):
    model = BusinessHours
    extra = 0
    max_num = 7  # Maximum 7 days
    ordering = ['day_of_week']


class BusinessMembershipInline(admin.TabularInline):
    model = BusinessMembership
    extra = 0
    fields = ['user', 'role', 'status', 'invited_by', 'created_at']
    readonly_fields = ['created_at']


class BusinessBranchInline(admin.TabularInline):
    model = BusinessBranch
    extra = 0


@admin.register(Business)
class BusinessAdmin(admin.ModelAdmin):
    list_display = ['title', 'owner', 'city', 'is_featured', 'is_verified', 'average_rating', 'total_reviews', 'created_at']
    list_filter = ['is_featured', 'is_verified', 'is_active', 'provides_home_service', 'created_at', 'sub_categories__category']
    list_editable = ['is_featured', 'is_verified']  # Quick edit from list view
    search_fields = ['title', 'description', 'owner__email', 'city']
    filter_horizontal = ['sub_categories']
    readonly_fields = ['average_rating', 'total_reviews', 'view_count', 'created_at', 'updated_at']
    ordering = ['-created_at']
    inlines = [
        BusinessMembershipInline, BusinessBranchInline, BusinessHoursInline,
        BusinessImageInline, BusinessVideoInline, ServiceInline, EmployeeInline,
    ]
    actions = ['make_featured', 'remove_featured']

    fieldsets = (
        ('Basic Information', {
            'fields': ('owner', 'title', 'slug', 'description', 'logo', 'sub_categories')
        }),
        ('Location', {
            'fields': ('latitude', 'longitude', 'address', 'city', 'country')
        }),
        ('Contact Information', {
            'fields': ('phone_number', 'email', 'website_link', 'facebook_link', 'instagram_link')
        }),
        ('Status', {
            'fields': ('is_featured', 'is_verified', 'is_active', 'provides_home_service')
        }),
        ('Statistics', {
            'fields': ('average_rating', 'total_reviews', 'view_count'),
            'classes': ('collapse',)
        }),
        ('Timestamps', {
            'fields': ('created_at', 'updated_at'),
            'classes': ('collapse',)
        }),
    )

    @admin.action(description='Mark selected businesses as Featured')
    def make_featured(self, request, queryset):
        updated = queryset.update(is_featured=True)
        self.message_user(request, f'{updated} business(es) marked as featured.')

    @admin.action(description='Remove Featured status from selected businesses')
    def remove_featured(self, request, queryset):
        updated = queryset.update(is_featured=False)
        self.message_user(request, f'{updated} business(es) removed from featured.')


@admin.register(BusinessHours)
class BusinessHoursAdmin(admin.ModelAdmin):
    list_display = ['business', 'day_of_week', 'opening_time', 'closing_time', 'is_closed', 'is_24_hours']
    list_filter = ['day_of_week', 'is_closed', 'is_24_hours']
    search_fields = ['business__title']
    ordering = ['business', 'day_of_week']


@admin.register(BusinessImage)
class BusinessImageAdmin(admin.ModelAdmin):
    list_display = ['business', 'caption', 'is_main', 'uploaded_at']
    list_filter = ['is_main', 'uploaded_at']
    search_fields = ['business__title', 'caption']
    ordering = ['-uploaded_at']


@admin.register(BusinessVideo)
class BusinessVideoAdmin(admin.ModelAdmin):
    list_display = ['business', 'title', 'uploaded_at']
    list_filter = ['uploaded_at']
    search_fields = ['business__title', 'title', 'description']
    ordering = ['-uploaded_at']


class ServiceImageInline(admin.TabularInline):
    model = ServiceImage
    extra = 1


@admin.register(Service)
class ServiceAdmin(admin.ModelAdmin):
    list_display = ['name', 'business', 'category', 'price', 'discount_price', 'availability', 'cta_type', 'is_active']
    list_filter = ['is_active', 'availability', 'cta_type', 'price_type', 'category', 'created_at']
    search_fields = ['name', 'business__title', 'service_id', 'sku']
    ordering = ['business', 'name']
    inlines = [ServiceImageInline]


@admin.register(BusinessBranch)
class BusinessBranchAdmin(admin.ModelAdmin):
    list_display = ['name', 'business', 'city', 'is_main', 'is_active', 'created_at']
    list_filter = ['is_main', 'is_active', 'created_at']
    search_fields = ['name', 'business__title', 'city', 'address']
    ordering = ['business', '-is_main', 'name']


@admin.register(BusinessMembership)
class BusinessMembershipAdmin(admin.ModelAdmin):
    list_display = ['user', 'business', 'role', 'status', 'created_at']
    list_filter = ['role', 'status', 'created_at']
    search_fields = ['user__email', 'business__title']
    ordering = ['-created_at']


@admin.register(Post)
class PostAdmin(admin.ModelAdmin):
    list_display = ['business', 'post_type', 'status', 'scheduled_for', 'published_at', 'created_at']
    list_filter = ['post_type', 'status', 'created_at']
    search_fields = ['business__title', 'caption']
    readonly_fields = ['created_at', 'updated_at']
    ordering = ['-created_at']

    @admin.action(description='Publish selected posts now')
    def publish_now(self, request, queryset):
        from django.utils import timezone
        updated = queryset.update(status='published', published_at=timezone.now())
        self.message_user(request, f'{updated} post(s) published.')

    actions = ['publish_now']


@admin.register(Offer)
class OfferAdmin(admin.ModelAdmin):
    list_display = ['title', 'business', 'offer_price', 'original_price', 'start_at', 'end_at', 'is_active']
    list_filter = ['is_active', 'start_at', 'end_at']
    search_fields = ['title', 'business__title']
    ordering = ['-created_at']


@admin.register(LeadEvent)
class LeadEventAdmin(admin.ModelAdmin):
    list_display = ['business', 'event_type', 'source', 'user', 'created_at']
    list_filter = ['event_type', 'source', 'created_at']
    search_fields = ['business__title', 'user__email']
    readonly_fields = ['business', 'user', 'event_type', 'source', 'listing', 'post', 'session_id', 'ip_address', 'created_at']
    ordering = ['-created_at']

    def has_add_permission(self, request):
        return False


@admin.register(Employee)
class EmployeeAdmin(admin.ModelAdmin):
    list_display = ['name', 'business', 'designation', 'is_active']
    list_filter = ['is_active', 'joined_date']
    search_fields = ['name', 'business__title', 'designation', 'employee_id']
    ordering = ['business', 'name']


class PastExperienceImageInline(admin.TabularInline):
    model = PastExperienceImage
    extra = 1


@admin.register(PastExperience)
class PastExperienceAdmin(admin.ModelAdmin):
    list_display = ['title', 'business', 'client_name', 'completion_date']
    list_filter = ['completion_date', 'created_at']
    search_fields = ['title', 'business__title', 'client_name']
    ordering = ['-completion_date']
    inlines = [PastExperienceImageInline]


class ReviewImageInline(admin.TabularInline):
    model = ReviewImage
    extra = 1


@admin.register(Review)
class ReviewAdmin(admin.ModelAdmin):
    list_display = ['business', 'user', 'rating', 'is_approved', 'is_featured', 'created_at']
    list_filter = ['rating', 'is_approved', 'is_featured', 'created_at']
    search_fields = ['business__title', 'user__email', 'message']
    readonly_fields = ['user', 'business', 'created_at', 'updated_at']
    ordering = ['-created_at']
    inlines = [ReviewImageInline]

    fieldsets = (
        ('Review Information', {
            'fields': ('business', 'user', 'rating', 'message')
        }),
        ('Business Response', {
            'fields': ('response', 'response_date')
        }),
        ('Status', {
            'fields': ('is_approved', 'is_featured')
        }),
        ('Timestamps', {
            'fields': ('created_at', 'updated_at'),
            'classes': ('collapse',)
        }),
    )


class ChatMessageInline(admin.TabularInline):
    model = ChatMessage
    extra = 0
    readonly_fields = ['sender_type', 'sender_user', 'message', 'is_read', 'created_at']
    can_delete = False


@admin.register(ChatRoom)
class ChatRoomAdmin(admin.ModelAdmin):
    list_display = ['user', 'business', 'last_message_time', 'unread_count_user', 'unread_count_business', 'is_active']
    list_filter = ['is_active', 'created_at', 'updated_at']
    search_fields = ['user__email', 'business__title']
    readonly_fields = ['last_message', 'last_message_time', 'last_message_by', 'created_at', 'updated_at']
    ordering = ['-updated_at']
    inlines = [ChatMessageInline]

    fieldsets = (
        ('Participants', {
            'fields': ('user', 'business')
        }),
        ('Last Message', {
            'fields': ('last_message', 'last_message_time', 'last_message_by')
        }),
        ('Unread Counts', {
            'fields': ('unread_count_user', 'unread_count_business')
        }),
        ('Status', {
            'fields': ('is_active',)
        }),
        ('Timestamps', {
            'fields': ('created_at', 'updated_at'),
            'classes': ('collapse',)
        }),
    )


@admin.register(ChatMessage)
class ChatMessageAdmin(admin.ModelAdmin):
    list_display = ['room', 'sender_type', 'sender_user', 'message_preview', 'is_read', 'created_at']
    list_filter = ['sender_type', 'is_read', 'created_at']
    search_fields = ['room__user__email', 'room__business__title', 'message']
    readonly_fields = ['room', 'sender_type', 'sender_user', 'created_at', 'read_at']
    ordering = ['-created_at']

    def message_preview(self, obj):
        return obj.message[:50] + '...' if len(obj.message) > 50 else obj.message
    message_preview.short_description = 'Message'


@admin.register(Notification)
class NotificationAdmin(admin.ModelAdmin):
    list_display = ['user', 'notification_type', 'title', 'is_read', 'created_at']
    list_filter = ['notification_type', 'is_read', 'created_at']
    search_fields = ['user__email', 'title', 'message']
    readonly_fields = ['user', 'business', 'review', 'chat_room', 'created_at', 'read_at']
    ordering = ['-created_at']

    fieldsets = (
        ('Recipient', {
            'fields': ('user',)
        }),
        ('Notification Content', {
            'fields': ('notification_type', 'title', 'message', 'action_url')
        }),
        ('Related Objects', {
            'fields': ('business', 'review', 'chat_room')
        }),
        ('Status', {
            'fields': ('is_read', 'read_at')
        }),
        ('Timestamp', {
            'fields': ('created_at',),
            'classes': ('collapse',)
        }),
    )


@admin.register(Feedback)
class FeedbackAdmin(admin.ModelAdmin):
    list_display = ['title', 'user', 'category', 'rating', 'status', 'created_at']
    list_filter = ['category', 'status', 'rating', 'created_at']
    list_editable = ['status']
    search_fields = ['title', 'message', 'user__email']
    readonly_fields = ['user', 'title', 'message', 'category', 'rating', 'device_info', 'created_at', 'updated_at']
    ordering = ['-created_at']

    fieldsets = (
        ('Feedback', {
            'fields': ('user', 'title', 'message', 'category', 'rating')
        }),
        ('Admin', {
            'fields': ('status', 'admin_notes')
        }),
        ('Debug', {
            'fields': ('device_info',),
            'classes': ('collapse',)
        }),
        ('Timestamps', {
            'fields': ('created_at', 'updated_at'),
            'classes': ('collapse',)
        }),
    )


@admin.register(ContactRequest)
class ContactRequestAdmin(admin.ModelAdmin):
    list_display = ['full_name', 'email', 'source', 'business', 'status', 'created_at']
    list_filter = ['source', 'status', 'created_at']
    list_editable = ['status']
    search_fields = ['full_name', 'email', 'phone_number', 'message']
    readonly_fields = ['full_name', 'email', 'phone_number', 'message', 'source', 'business', 'created_at']
    ordering = ['-created_at']
