from django.contrib import admin
from django.contrib.auth.admin import UserAdmin
from django.contrib.auth.models import User
from .models import Profile, TransferOrder, FileSelection, LocalUploadedFile

# Profile Inline for User Admin
class ProfileInline(admin.StackedInline):
    model = Profile
    can_delete = False
    verbose_name_plural = 'Profile'
    fk_name = 'user'
    fields = ('email', 'agreed_to_terms', 'terms_agreed_at', 'created_at', 'updated_at')
    readonly_fields = ('created_at', 'updated_at')

# Custom User Admin
class CustomUserAdmin(UserAdmin):
    inlines = (ProfileInline,)
    list_display = ('username', 'email', 'first_name', 'last_name', 'is_staff', 'get_profile_email', 'date_joined')
    list_select_related = ('profile',)
    
    def get_profile_email(self, instance):
        return instance.profile.email
    get_profile_email.short_description = 'Profile Email'
    
    def get_inline_instances(self, request, obj=None):
        if not obj:
            return list()
        return super().get_inline_instances(request, obj)

# File Selection Inline for Transfer Order
class FileSelectionInline(admin.TabularInline):
    model = FileSelection
    extra = 0
    readonly_fields = ('selected_at', 'downloaded_at', 'download_status', 'download_attempts', 'download_error')
    fields = ('file_id', 'file_name', 'file_path', 'file_size', 'mime_type', 'cloud_source', 
              'download_status', 'download_attempts', 'download_error', 'selected_at', 'downloaded_at')
    can_delete = True

# Transfer Order Admin
class TransferOrderAdmin(admin.ModelAdmin):
    list_display = ('order_number', 'user', 'cloud_source', 'status', 'storage_type', 'storage_size', 
                   'total_files', 'total_size', 'payment_amount', 'payment_currency', 
                   'retry_count', 'created_at', 'download_started_at', 'download_completed_at')
    
    list_filter = ('status', 'cloud_source', 'storage_type', 'created_at', 'updated_at', 
                  'download_started_at', 'download_completed_at')
    
    search_fields = ('user__username', 'user__email', 'order_number', 'shipping_address', 'download_status')
    
    readonly_fields = ('created_at', 'updated_at', 'download_started_at', 'download_completed_at', 
                      'order_number', 'estimated_completion')
    
    inlines = [FileSelectionInline]
    
    fieldsets = (
        ('Order Information', {
            'fields': ('order_number', 'user', 'cloud_source', 'status', 'total_files', 'total_size')
        }),
        ('Cloud Authentication', {
            'fields': ('access_token', 'refresh_token', 'token_expiry'),
            'classes': ('collapse',)
        }),
        ('Storage & Shipping', {
            'fields': ('storage_type', 'storage_size', 'shipping_address')
        }),
        ('Payment Information', {
            'fields': ('payment_method', 'payment_amount', 'payment_currency')
        }),
        ('Download Tracking', {
            'fields': ('download_status', 'retry_count', 'download_started_at', 
                      'download_completed_at', 'estimated_completion')
        }),
        ('File Data', {
            'fields': ('selected_files', 'download_log'),
            'classes': ('collapse',)
        }),
        ('Timestamps', {
            'fields': ('created_at', 'updated_at'),
            'classes': ('collapse',)
        })
    )

# File Selection Admin
class FileSelectionAdmin(admin.ModelAdmin):
    list_display = ('file_name', 'order', 'cloud_source', 'file_size', 'file_size_gb', 
                   'download_status', 'download_attempts', 'download_size', 
                   'selected_at', 'downloaded_at')
    
    list_filter = ('cloud_source', 'download_status', 'selected_at', 'downloaded_at', 'mime_type')
    
    search_fields = ('file_name', 'file_id', 'order__order_number', 'order__user__username', 
                    'order__user__email', 'download_error')
    
    readonly_fields = ('selected_at', 'downloaded_at', 'file_size_gb')
    
    fields = ('order', 'file_id', 'file_name', 'file_path', 'file_size', 'file_size_gb', 
             'mime_type', 'cloud_source', 'download_status', 'download_attempts', 
             'download_size', 'download_error', 'selected_at', 'downloaded_at')

# Profile Admin
class ProfileAdmin(admin.ModelAdmin):
    list_display = ('user', 'email', 'agreed_to_terms', 'terms_agreed_at', 'created_at', 'updated_at')
    list_filter = ('agreed_to_terms', 'created_at', 'updated_at', 'terms_agreed_at')
    search_fields = ('user__username', 'email', 'user__first_name', 'user__last_name')
    readonly_fields = ('created_at', 'updated_at')
    fields = ('user', 'email', 'agreed_to_terms', 'terms_agreed_at', 'created_at', 'updated_at')




# Unregister default User admin and register custom one
admin.site.unregister(User)
admin.site.register(User, CustomUserAdmin)

# Register your models
admin.site.register(Profile, ProfileAdmin)
admin.site.register(TransferOrder, TransferOrderAdmin)
admin.site.register(FileSelection, FileSelectionAdmin )
admin.site.register(LocalUploadedFile)