from django.contrib import admin
from django.contrib.auth.admin import UserAdmin as BaseUserAdmin
from .models import Organization, User, Subscription, OTPVerification, Coupon, Payment, KnownDevice, LoginOTP, TopUpOrder, PlatformSettings


@admin.register(PlatformSettings)
class PlatformSettingsAdmin(admin.ModelAdmin):
    list_display  = ['ovse_base_url', 'updated_at']
    readonly_fields = ['updated_at']

    def has_add_permission(self, request):
        # Singleton — only one row should ever exist.
        return not PlatformSettings.objects.exists()

    def has_delete_permission(self, request, obj=None):
        return False


@admin.register(Organization)
class OrganizationAdmin(admin.ModelAdmin):
    list_display    = ['name', 'slug', 'sector', 'plan', 'is_trial',
                       'trial_days_remaining', 'trial_expired', 'is_active', 'created_at']
    list_filter     = ['sector', 'plan', 'is_trial', 'trial_expired', 'is_active']
    search_fields   = ['name', 'slug', 'email']
    readonly_fields = ['created_at', 'updated_at', 'callback_url',
                       'trial_start', 'trial_end', 'plan_start', 'plan_end']
    list_editable   = ['is_active']
    actions         = ['activate_orgs', 'deactivate_orgs', 'extend_trials']

    def activate_orgs(self, request, queryset):
        queryset.update(is_active=True, trial_expired=False)
        self.message_user(request, f'{queryset.count()} organizations activated.')
    activate_orgs.short_description = 'Activate selected organizations'

    def deactivate_orgs(self, request, queryset):
        queryset.update(is_active=False)
        self.message_user(request, f'{queryset.count()} organizations deactivated.')
    deactivate_orgs.short_description = 'Deactivate selected organizations'

    def extend_trials(self, request, queryset):
        from django.utils.timezone import now, timedelta
        for org in queryset:
            org.trial_end     = (org.trial_end or now()) + timedelta(days=15)
            org.trial_expired = False
            org.is_active     = True
            org.save()
        self.message_user(request, f'Trial extended for {queryset.count()} organizations.')
    extend_trials.short_description = 'Extend trial by 15 days'


@admin.register(User)
class UserAdmin(BaseUserAdmin):
    list_display  = ['email', 'name', 'org', 'role', 'is_active', 'created_at']
    list_filter   = ['role', 'is_active']
    search_fields = ['email', 'name']
    ordering      = ['-created_at']
    fieldsets     = (
        (None,          {'fields': ('email', 'password')}),
        ('Information', {'fields': ('name', 'org', 'role')}),
        ('Permissions', {'fields': ('is_active', 'is_staff', 'is_superuser')}),
    )
    add_fieldsets = (
        (None, {
            'classes': ('wide',),
            'fields':  ('email', 'name', 'org', 'role', 'password1', 'password2'),
        }),
    )


@admin.register(Subscription)
class SubscriptionAdmin(admin.ModelAdmin):
    list_display  = ['org', 'plan', 'status', 'amount', 'start_date', 'end_date']
    list_filter   = ['plan', 'status']
    search_fields = ['org__name']


@admin.register(OTPVerification)
class OTPVerificationAdmin(admin.ModelAdmin):
    list_display  = ['email', 'otp', 'is_used', 'created_at', 'expires_at']
    list_filter   = ['is_used']
    search_fields = ['email']
    readonly_fields = ['created_at', 'expires_at', 'otp', 'form_data']


@admin.register(Coupon)
class CouponAdmin(admin.ModelAdmin):
    list_display  = ['code', 'discount_type', 'discount_value',
                     'used_count', 'max_uses', 'is_active', 'valid_until']
    list_filter   = ['discount_type', 'is_active']
    search_fields = ['code', 'description']
    list_editable = ['is_active']
    readonly_fields = ['used_count', 'created_at']
    fieldsets = (
        ('Coupon Details', {
            'fields': ('code', 'description', 'is_active')
        }),
        ('Discount', {
            'fields': ('discount_type', 'discount_value', 'applicable_plans')
        }),
        ('Limits & Validity', {
            'fields': ('max_uses', 'used_count', 'valid_from', 'valid_until')
        }),
        ('Info', {
            'fields': ('created_at',)
        }),
    )


@admin.register(KnownDevice)
class KnownDeviceAdmin(admin.ModelAdmin):
    list_display  = ['user', 'device_label', 'ip_address', 'last_used_at', 'created_at']
    search_fields = ['user__email', 'device_label']
    readonly_fields = ['created_at', 'last_used_at']


@admin.register(LoginOTP)
class LoginOTPAdmin(admin.ModelAdmin):
    list_display  = ['user', 'otp', 'is_used', 'created_at', 'expires_at']
    list_filter   = ['is_used']
    search_fields = ['user__email']
    readonly_fields = ['created_at']


@admin.register(Payment)
class PaymentAdmin(admin.ModelAdmin):
    list_display  = ['org', 'plan', 'original_amount', 'discount_amount',
                     'final_amount', 'gateway', 'status', 'created_at']
    list_filter   = ['plan', 'status', 'gateway']
    search_fields = ['org__name', 'gateway_order_id', 'gateway_payment_id']
    readonly_fields = ['created_at', 'updated_at']


@admin.register(TopUpOrder)
class TopUpOrderAdmin(admin.ModelAdmin):
    list_display  = ['org', 'pack', 'verifications', 'final_amount', 'status', 'created_at']
    list_filter   = ['pack', 'status']
    search_fields = ['org__name', 'gateway_order_id']
    readonly_fields = ['created_at', 'updated_at']
