"""
Vendor Admin - Management Interface
"""
from django.contrib import admin
from django.utils.html import format_html
from django.urls import reverse
from django.utils import timezone
from .models import (
    SubscriptionPlan, Vendor, VendorSubscriptionPayment,
    VendorCommission, VendorPayout, VendorStore
)


@admin.register(SubscriptionPlan)
class SubscriptionPlanAdmin(admin.ModelAdmin):
    list_display = ('name', 'plan_type', 'monthly_fee', 'yearly_fee', 'commission_rate', 'max_products', 'is_active')
    list_filter = ('is_active', 'plan_type')
    search_fields = ('name', 'description')
    
    fieldsets = (
        ('Basic Information', {
            'fields': ('name', 'plan_type', 'description', 'is_active')
        }),
        ('Pricing', {
            'fields': ('monthly_fee', 'yearly_fee', 'commission_rate')
        }),
        ('Features', {
            'fields': (
                'max_products', 'max_images_per_product', 
                'can_use_ai_tools', 'priority_support',
                'custom_store_url', 'analytics_access'
            )
        }),
    )


from django import forms
from django.core.exceptions import ValidationError

class VendorAdminForm(forms.ModelForm):
    class Meta:
        model = Vendor
        fields = '__all__'

    def clean(self):
        cleaned_data = super().clean()
        kyc_approved = cleaned_data.get('kyc_approved')
        
        if kyc_approved:
            errors = {}
            instance = self.instance

            def get_val(field_name):
                if field_name in cleaned_data:
                    return cleaned_data.get(field_name)
                return getattr(instance, field_name, None)

            # Check required fields for KYC approval
            if not (get_val('aadhaar_no') or '').strip():
                errors['aadhaar_no'] = 'This field is required for KYC approval.'
            if not (get_val('gst_no') or '').strip():
                errors['gst_no'] = 'This field is required for KYC approval.'
            
            def check_file(field_name):
                if field_name in cleaned_data:
                    val = cleaned_data.get(field_name)
                    if val is False: return False # Cleared
                    if val: return True # New file
                    # None -> keep existing
                    return bool(instance and getattr(instance, field_name))
                return bool(instance and getattr(instance, field_name))

            if not check_file('consent_form'): errors['consent_form'] = 'This field is required for KYC approval.'
            if not check_file('gst_photo'): errors['gst_photo'] = 'This field is required for KYC approval.'
            if not check_file('kyc_photo'): errors['kyc_photo'] = 'This field is required for KYC approval.'
            if not check_file('kyc_address_proof'): errors['kyc_address_proof'] = 'This field is required for KYC approval.'

            if errors:
                raise ValidationError(errors)
        
        return cleaned_data

@admin.register(Vendor)
class VendorAdmin(admin.ModelAdmin):
    form = VendorAdminForm
    list_display = (
        'store_name', 'business_name', 'user_email', 'subscription_plan',
        'status_badge', 'total_sales', 'subscription_status', 'created_at'
    )
    list_filter = ('status', 'subscription_plan', 'is_verified', 'created_at')
    search_fields = ('store_name', 'business_name', 'user__email', 'business_email')
    readonly_fields = ('store_slug', 'total_sales', 'total_orders', 'rating', 'created_at', 'updated_at', 
                       'preview_store_logo', 'preview_store_banner', 'preview_consent_form', 'preview_gst_photo', 
                       'preview_kyc_photo', 'preview_address_proof', 'preview_cheque_photo')
    
    fieldsets = (
        ('Store Information', {
            'fields': ('user', 'store_name', 'store_slug', 'store_description', 'store_logo', 'preview_store_logo', 'store_banner', 'preview_store_banner')
        }),
        ('Business Details', {
            'fields': ('business_name', 'business_type', 'tax_id', 'aadhaar_no', 'gst_no', 
                       'consent_form', 'preview_consent_form', 
                       'gst_photo', 'preview_gst_photo', 
                       'kyc_photo', 'preview_kyc_photo', 
                       'kyc_address_proof', 'preview_address_proof', 
                       'business_email', 'business_phone', 'website')
        }),
        ('Address', {
            'fields': ('address_line1', 'address_line2', 'city', 'state', 'country', 'postal_code')
        }),
        ('Subscription', {
            'fields': ('subscription_plan', 'subscription_start_date', 'subscription_end_date')
        }),
        ('Payment Information', {
            'fields': ('billing_policy', 'bank_account_name', 'bank_account_number', 'bank_name', 'bank_routing_number', 'crossed_cheque_photo', 'preview_cheque_photo')
        }),
        ('Statistics', {
            'fields': ('total_sales', 'total_orders', 'rating', 'total_reviews')
        }),
        ('Status', {
            'fields': ('status', 'is_verified', 'kyc_submitted', 'kyc_approved', 'approved_at', 'store_limit')
        }),
        ('Timestamps', {
            'fields': ('created_at', 'updated_at')
        }),
    )
    
    actions = ['approve_vendors', 'suspend_vendors', 'activate_vendors']
    def get_readonly_fields(self, request, obj=None):
        ro = list(super().get_readonly_fields(request, obj))
        if obj and (obj.is_verified or obj.kyc_approved):
            ro += ['business_name', 'business_type', 'tax_id', 'aadhaar_no', 'gst_no', 'consent_form', 'gst_photo', 'kyc_photo', 'address_line1', 'address_line2', 'city', 'state', 'country', 'postal_code']
        return ro
    
    def user_email(self, obj):
        return obj.user.email
    user_email.short_description = 'User Email'
    
    def status_badge(self, obj):
        colors = {
            'PENDING': 'orange',
            'ACTIVE': 'green',
            'SUSPENDED': 'red',
            'CLOSED': 'gray'
        }
        color = colors.get(obj.status, 'gray')
        status = obj.get_status_display()
        return format_html(
            '<span style="background-color: {}; color: white; padding: 3px 10px; border-radius: 3px;">{}</span>',
            color, status
        )
    status_badge.short_description = 'Status'
    
    def subscription_status(self, obj):
        if obj.is_subscription_active:
            return format_html('<span style="color: {};">{}</span>', 'green', 'Active')
        return format_html('<span style="color: {};">{}</span>', 'red', 'Expired')
    subscription_status.short_description = 'Subscription'
    
    def product_count(self, obj):
        return obj.products.filter(is_active=True).count()
    product_count.short_description = 'Products'
    product_count.admin_order_field = 'products__count'
    
    def approve_vendors(self, request, queryset):
        approved = 0
        for obj in queryset:
            has_docs = all([
                bool(obj.aadhaar_no),
                bool(obj.gst_no),
                bool(obj.consent_form),
                bool(obj.gst_photo),
                bool(obj.kyc_photo),
                bool(obj.kyc_address_proof),
            ])
            if not has_docs:
                continue
            obj.status = 'ACTIVE'
            obj.is_verified = True
            obj.kyc_approved = True
            obj.approved_at = timezone.now()
            obj.save()
            approved += 1
        self.message_user(request, str(approved) + ' vendors approved.')
    approve_vendors.short_description = 'Approve selected vendors'
    
    def suspend_vendors(self, request, queryset):
        queryset.update(status='SUSPENDED')
        self.message_user(request, str(queryset.count()) + ' vendors suspended.')
    suspend_vendors.short_description = 'Suspend selected vendors'
    
    def activate_vendors(self, request, queryset):
        queryset.update(status='ACTIVE')
        self.message_user(request, str(queryset.count()) + ' vendors activated.')
    activate_vendors.short_description = 'Activate selected vendors'

    # --- Previews for KYC ---
    def _preview_image(self, obj, field_name):
        image = getattr(obj, field_name)
        if image:
            try:
                url = image.url
                return format_html(
                    '<div style="margin-top:5px; margin-bottom:10px;">'
                    '<a href="{}" target="_blank">'
                    '<img src="{}" style="max-height: 300px; max-width: 100%; border: 1px solid #ccc; padding: 2px; border-radius: 4px;" />'
                    '</a><br>'
                    '<a href="{}" target="_blank" style="display:inline-block; margin-top:5px;">Open Full Size</a>'
                    '</div>', 
                    url, url, url
                )
            except ValueError:
                return "Image missing or invalid path"
        return "No image uploaded"

    def preview_kyc_photo(self, obj):
        return self._preview_image(obj, 'kyc_photo')
    preview_kyc_photo.short_description = "KYC Photo Preview"

    def preview_gst_photo(self, obj):
        return self._preview_image(obj, 'gst_photo')
    preview_gst_photo.short_description = "GST Photo Preview"
    
    def preview_address_proof(self, obj):
        return self._preview_image(obj, 'kyc_address_proof')
    preview_address_proof.short_description = "Address Proof Preview"

    def preview_cheque_photo(self, obj):
        return self._preview_image(obj, 'crossed_cheque_photo')
    preview_cheque_photo.short_description = "Cheque Photo Preview"
    
    def preview_store_logo(self, obj):
        return self._preview_image(obj, 'store_logo')
    preview_store_logo.short_description = "Store Logo Preview"
    
    def preview_store_banner(self, obj):
        return self._preview_image(obj, 'store_banner')
    preview_store_banner.short_description = "Store Banner Preview"

    def preview_consent_form(self, obj):
        file = obj.consent_form
        if file:
            try:
                url = file.url
                if url.lower().endswith('.pdf'):
                    return format_html(
                        '<div style="margin-top:5px;">'
                        '<iframe src="{}" width="100%" height="500px" style="border:1px solid #ccc;"></iframe><br>'
                        '<a href="{}" target="_blank" class="button" style="margin-top:5px;">Open PDF in New Tab</a>'
                        '</div>',
                        url, url
                    )
                else:
                    return self._preview_image(obj, 'consent_form')
            except ValueError:
                return "File missing or invalid path"
        return "No file uploaded"
    preview_consent_form.short_description = "Consent Form Preview"

class VendorStoreInline(admin.TabularInline):
    model = VendorStore
    extra = 0
    fields = ('name', 'slug', 'is_active')
    readonly_fields = ('slug',)

@admin.register(VendorStore)
class VendorStoreAdmin(admin.ModelAdmin):
    list_display = ('name', 'vendor', 'is_active', 'created_at')
    list_filter = ('is_active',)
    search_fields = ('name', 'vendor__store_name')
    readonly_fields = ('created_at', 'updated_at')


@admin.register(VendorSubscriptionPayment)
class VendorSubscriptionPaymentAdmin(admin.ModelAdmin):
    list_display = ('vendor', 'subscription_plan', 'amount', 'status', 'period_start', 'period_end', 'paid_at')
    list_filter = ('status', 'subscription_plan', 'created_at')
    search_fields = ('vendor__store_name', 'transaction_id')
    readonly_fields = ('created_at',)
    
    fieldsets = (
        ('Payment Information', {
            'fields': ('vendor', 'subscription_plan', 'amount', 'payment_method', 'transaction_id')
        }),
        ('Period', {
            'fields': ('period_start', 'period_end')
        }),
        ('Status', {
            'fields': ('status', 'paid_at', 'created_at')
        }),
    )


@admin.register(VendorCommission)
class VendorCommissionAdmin(admin.ModelAdmin):
    list_display = (
        'vendor', 'order_code', 'order_total', 'commission_rate',
        'commission_amount', 'vendor_payout', 'payout_status', 'created_at'
    )
    list_filter = ('is_paid', 'created_at')
    search_fields = ('vendor__store_name', 'order__order_code')
    readonly_fields = ('commission_amount', 'vendor_payout', 'created_at')
    
    def order_code(self, obj):
        return obj.order.order_code
    order_code.short_description = 'Order Code'
    
    def payout_status(self, obj):
        if obj.is_paid:
            return format_html('<span style="color: {};">{}</span>', 'green', '✓ Paid')
        return format_html('<span style="color: {};">{}</span>', 'orange', 'Pending')
    payout_status.short_description = 'Payout Status'


@admin.register(VendorPayout)
class VendorPayoutAdmin(admin.ModelAdmin):
    list_display = ('id', 'vendor', 'amount', 'status', 'payment_method', 'created_at', 'completed_at')
    list_filter = ('status', 'payment_method', 'created_at')
    search_fields = ('vendor__store_name', 'transaction_reference')
    readonly_fields = ('created_at',)
    
    fieldsets = (
        ('Payout Information', {
            'fields': ('vendor', 'amount', 'commissions')
        }),
        ('Payment Details', {
            'fields': ('payment_method', 'transaction_reference')
        }),
        ('Status', {
            'fields': ('status', 'created_at', 'processed_at', 'completed_at')
        }),
        ('Notes', {
            'fields': ('notes',)
        }),
    )
