from django.contrib import admin
from django.contrib.auth.admin import UserAdmin as BaseUserAdmin

from .models import *
from django.contrib import admin

admin.site.site_header = "NC-ECOM Administration"
admin.site.site_title = "NC-ECOM Admin Portal"
admin.site.index_title = "Welcome to NC-ECOM Dashboard"

@admin.register(User)
class UserAdmin(BaseUserAdmin):
    model = User

    list_display = (
        'id',
        'email',
        'phone',
        'full_name',
        'role',
        'is_email_verified',
        'is_phone_verified',
        'is_staff',
        'is_active',
        'created_at',
    )

    list_filter = (
        'is_staff',
        'is_active',
        'is_email_verified',
        'is_phone_verified',
        'gender',
        'role',
    )

    search_fields = ('email', 'phone', 'full_name', 'role')
    ordering = ('-created_at',)

    fieldsets = (
        ('Authentication', {'fields': ('email', 'password')}),
        # ('Personal Info', {'fields': ('full_name', 'phone', 'profile_image', 'gender', 'date_of_birth')}),
        ('Personal Info', {
    'fields': (
        'full_name',
        'phone',
        'profile_image',
        'gender',
        'date_of_birth',
        'role',
    )
}),
        ('Verification', {'fields': ('is_email_verified', 'is_phone_verified')}),
        ('Permissions', {'fields': ('is_active', 'is_staff', 'is_superuser', 'groups', 'user_permissions')}),
        ('Extra', {'fields': ('extra_data',)}),
        ('Timestamps', {'fields': ('created_at', 'updated_at',)}),
    )

    readonly_fields = ('created_at', 'updated_at')

    add_fieldsets = (
        (
            None,
            {
                'classes': ('wide',),
                'fields': ('email', 'phone', 'full_name', 'password1', 'password2', 'is_staff', 'is_active'),
            },
        ),
    )


@admin.register(OTPVerification)
class OTPVerificationAdmin(admin.ModelAdmin):
    list_display = (
        'id',
        'email_or_phone',
        'otp_code',
        'otp_type',
        'is_used',
        'expires_at',
        'created_at',
    )
    list_filter = ('otp_type', 'is_used', 'is_active')
    search_fields = ('email_or_phone', 'otp_code')
    ordering = ('-created_at',)
    
    
@admin.register(Category)
class CategoryAdmin(admin.ModelAdmin):
    list_display = ('id', 'name', 'slug', 'parent_category', 'show_on_home', 'is_active', 'created_at')
    list_filter = ('show_on_home', 'is_active')
    search_fields = ('name', 'slug')
    prepopulated_fields = {'slug': ('name',)}


@admin.register(Brand)
class BrandAdmin(admin.ModelAdmin):
    list_display = ('id', 'name', 'slug', 'is_active', 'created_at')
    list_filter = ('is_active',)
    search_fields = ('name', 'slug')
    prepopulated_fields = {'slug': ('name',)}


class ProductImageInline(admin.TabularInline):
    model = ProductImage
    extra = 1


class ProductSpecificationInline(admin.TabularInline):
    model = ProductSpecification
    extra = 1


class ProductHighlightInline(admin.TabularInline):
    model = ProductHighlight
    extra = 1


@admin.register(Product)
class ProductAdmin(admin.ModelAdmin):
    list_display = (
        'id',
        'name',
        'slug',
        'sku',
        'category',
        'brand',
        'price',
        'stock_quantity',
        'is_featured',
        'is_best_selling',
        'is_active',
        'created_at',
    )
    list_filter = (
        'category',
        'brand',
        'is_featured',
        'is_best_selling',
        'is_trending',
        'is_active',
    )
    search_fields = ('name', 'slug', 'sku')
    prepopulated_fields = {'slug': ('name',)}
    inlines = [ProductImageInline, ProductSpecificationInline, ProductHighlightInline]


@admin.register(Banner)
class BannerAdmin(admin.ModelAdmin):
    list_display = ('id', 'title', 'banner_type', 'show_on_home', 'sort_order', 'is_active')
    list_filter = ('banner_type', 'show_on_home', 'is_active')
    search_fields = ('title',)
    
    
@admin.register(WishlistItem)
class WishlistItemAdmin(admin.ModelAdmin):
    list_display = ('id', 'user', 'product', 'created_at')
    search_fields = ('user__email', 'product__name')
    list_filter = ('created_at',)


class CartItemInline(admin.TabularInline):
    model = CartItem
    extra = 0


@admin.register(Cart)
class CartAdmin(admin.ModelAdmin):
    list_display = ('id', 'user', 'total_items', 'subtotal', 'created_at')
    search_fields = ('user__email',)
    inlines = [CartItemInline]


@admin.register(Address)
class AddressAdmin(admin.ModelAdmin):
    list_display = (
        'id',
        'user',
        'full_name',
        'phone',
        'city',
        'state',
        'postal_code',
        'address_type',
        'is_default',
        'created_at',
    )
    search_fields = ('user__email', 'full_name', 'phone', 'city', 'postal_code')
    list_filter = ('address_type', 'is_default', 'state', 'city')
    
@admin.register(Coupon)
class CouponAdmin(admin.ModelAdmin):
    list_display = (
        'id',
        'code',
        'title',
        'discount_type',
        'discount_value',
        'minimum_order_amount',
        'valid_from',
        'valid_to',
        'is_active',
    )
    search_fields = ('code', 'title')
    list_filter = ('discount_type', 'is_active', 'is_first_order_only')


class OrderItemInline(admin.TabularInline):
    model = OrderItem
    extra = 0
    readonly_fields = ('product_name', 'product_sku', 'quantity', 'unit_price', 'total_price')


@admin.register(Order)
class OrderAdmin(admin.ModelAdmin):
    list_display = (
        'id',
        'order_number',
        'user',
        'status',
        'payment_method',
        'payment_status',
        'total_amount',
        'placed_at',
    )
    search_fields = ('order_number', 'user__email', 'user__phone')
    list_filter = ('status', 'payment_method', 'payment_status')
    inlines = [OrderItemInline]


@admin.register(PaymentTransaction)
class PaymentTransactionAdmin(admin.ModelAdmin):
    list_display = (
        'id',
        'user',
        'order',
        'payment_gateway',
        'amount',
        'status',
        'paid_at',
        'created_at',
    )
    search_fields = ('user__email', 'gateway_order_id', 'gateway_payment_id')
    list_filter = ('payment_gateway', 'status')
    
    
    
class ProductReviewImageInline(admin.TabularInline):
    model = ProductReviewImage
    extra = 0


@admin.register(ProductReview)
class ProductReviewAdmin(admin.ModelAdmin):
    list_display = (
        'id',
        'user',
        'product',
        'rating',
        'is_verified_purchase',
        'created_at',
    )
    search_fields = ('user__email', 'product__name', 'review_text')
    list_filter = ('rating', 'is_verified_purchase')
    inlines = [ProductReviewImageInline]


@admin.register(ReturnRequest)
class ReturnRequestAdmin(admin.ModelAdmin):
    list_display = (
        'id',
        'request_number',
        'user',
        'order',
        'status',
        'refund_amount',
        'requested_at',
    )
    search_fields = ('request_number', 'user__email', 'order__order_number')
    list_filter = ('status',)


class SupportTicketMessageInline(admin.TabularInline):
    model = SupportTicketMessage
    extra = 0


@admin.register(SupportTicket)
class SupportTicketAdmin(admin.ModelAdmin):
    list_display = (
        'id',
        'ticket_number',
        'user',
        'category',
        'title',
        'status',
        'priority',
        'created_at',
    )
    search_fields = ('ticket_number', 'user__email', 'title')
    list_filter = ('category', 'status', 'priority')
    inlines = [SupportTicketMessageInline]


@admin.register(ServiceRequest)
class ServiceRequestAdmin(admin.ModelAdmin):
    list_display = (
        'id',
        'request_number',
        'user',
        'device_type',
        'title',
        'status',
        'warranty_status',
        'created_at',
    )
    search_fields = ('request_number', 'user__email', 'title')
    list_filter = ('device_type', 'status', 'warranty_status')



@admin.register(CMSPage)
class CMSPageAdmin(admin.ModelAdmin):
    list_display = (
        'id',
        'title',
        'slug',
        'page_type',
        'is_active',
        'updated_at',
    )
    search_fields = ('title', 'slug', 'page_type')
    list_filter = ('page_type', 'is_active')
    prepopulated_fields = {'slug': ('title',)}


@admin.register(Notification)
class NotificationAdmin(admin.ModelAdmin):
    list_display = (
        'id',
        'user',
        'title',
        'notification_type',
        'is_read',
        'created_at',
    )
    search_fields = ('user__email', 'title', 'message')
    list_filter = ('notification_type', 'is_read')


@admin.register(RecentSearch)
class RecentSearchAdmin(admin.ModelAdmin):
    list_display = (
        'id',
        'user',
        'keyword',
        'created_at',
    )
    search_fields = ('user__email', 'keyword')


@admin.register(RecentlyViewed)
class RecentlyViewedAdmin(admin.ModelAdmin):
    list_display = (
        'id',
        'user',
        'product',
        'viewed_at',
    )
    search_fields = ('user__email', 'product__name')
    
    
    
@admin.register(CashbackRule)
class CashbackRuleAdmin(admin.ModelAdmin):
    list_display = (
        'id',
        'title',
        'rule_type',
        'threshold_amount',
        'reward_amount',
        'cumulative_days',
        'credit_on_status',
        'start_date',
        'end_date',
        'is_active',
    )
    list_filter = ('rule_type', 'credit_on_status', 'is_active')
    search_fields = ('title', 'description')


@admin.register(CashbackWallet)
class CashbackWalletAdmin(admin.ModelAdmin):
    list_display = (
        'id',
        'user',
        'available_balance',
        'locked_balance',
        'total_earned',
        'total_redeemed',
        'created_at',
    )
    search_fields = ('user__email', 'user__phone')


@admin.register(CashbackTransaction)
class CashbackTransactionAdmin(admin.ModelAdmin):
    list_display = (
        'id',
        'user',
        'transaction_type',
        'source_type',
        'amount',
        'balance_after_transaction',
        'created_at',
    )
    list_filter = ('transaction_type', 'source_type')
    search_fields = ('user__email', 'remark')


@admin.register(CashbackRewardLog)
class CashbackRewardLogAdmin(admin.ModelAdmin):
    list_display = (
        'id',
        'user',
        'rule',
        'order',
        'credited_amount',
        'credited_at',
    )
    search_fields = ('user__email', 'reward_key')
    
    
@admin.register(InvoiceDocument)
class InvoiceDocumentAdmin(admin.ModelAdmin):
    list_display = (
        'id',
        'invoice_number',
        'user',
        'order',
        'email_sent',
        'emailed_at',
        'created_at',
    )
    search_fields = ('invoice_number', 'user__email', 'order__order_number')
    list_filter = ('email_sent',)


@admin.register(TallySyncLog)
class TallySyncLogAdmin(admin.ModelAdmin):
    list_display = (
        'id',
        'sync_type',
        'status',
        'user',
        'order',
        'product',
        'retry_count',
        'synced_at',
        'created_at',
    )
    search_fields = ('order__order_number', 'user__email', 'product__name')
    list_filter = ('sync_type', 'status')
    
    
    @admin.register(SavedPaymentMethod)
    class SavedPaymentMethodAdmin(admin.ModelAdmin):
        list_display = (
            'id',
            'user',
            'payment_type',
            'provider',
            'is_default',
            'created_at',
        )
        search_fields = ('user', 'title')
        list_filter = ('payment_type', 'is_default')
        
        @admin.register(DeliveryAgent)
        class DeliveryAgentAdmin(admin.ModelAdmin):

            list_display = (

                "id",

                "user",

                "vehicle_number",

                "is_available",
            )

            list_filter = (

                "is_available",
            )

            search_fields = (

                "user__full_name",

                "vehicle_number",
            )   
