import datetime
from django.contrib import admin
from django import forms
from django.utils.safestring import mark_safe
from django.contrib.auth.admin import UserAdmin as BaseUserAdmin
from adminsortable2.admin import SortableAdminMixin
from django.utils import timezone
from django.utils.html import format_html
from django.contrib import messages
from allauth.account.models import EmailAddress
from ckeditor.widgets import CKEditorWidget

# Models Import
from .models import (
    Job, Application, Profile, ContactMessage, RecruiterProfile, 
    User, ReferralWallet, Transaction, WithdrawalRequest, 
    CandidateWallet, CoinTransaction, LuckyWheelActivity, 
    IndustryMaster, TradePosition, NewsPost, CountryGuide, FormOTP, EmployerRequirement
)

from .utils_ai import generate_country_guide_ai

# ✅ 1. Custom User Admin Class
class MyUserAdmin(BaseUserAdmin):
    # List mein dikhne waale columns
    list_display = ('username', 'full_name', 'email', 'is_candidate', 'is_recruiter', 'is_staff', 'is_verified_status')
    list_filter = ('is_candidate', 'is_recruiter', 'is_staff', 'is_superuser')
    search_fields = ('username', 'full_name', 'email')
    ordering = ('-date_joined',)
    
    # 🚀 NAYA: Bulk Action register karna zaroori hai
    actions = ['make_verified']

    # ✅ NAYA: Verified Status Column Logic
    def is_verified_status(self, obj):
        """Check karta hai ki user ka email verified hai ya nahi"""
        email_obj = EmailAddress.objects.filter(user=obj, primary=True).first()
        if email_obj and email_obj.verified:
            return True
        return False
    
    is_verified_status.boolean = True  # Isse Green Tick / Red Cross dikhega
    is_verified_status.short_description = 'Verified'
    
    # ✅ NAYA: Bulk Action Logic
    def make_verified(self, request, queryset):
        """Selected users ko ek click mein verify karne ke liye"""
        count = 0
        for user in queryset:
            email_obj = EmailAddress.objects.filter(user=user, primary=True).first()
            if email_obj:
                email_obj.verified = True
                email_obj.save()
                count += 1
            else:
                # Agar user ka EmailAddress record nahi hai toh naya bana dega
                EmailAddress.objects.create(user=user, email=user.email, primary=True, verified=True)
                count += 1
        
        self.message_user(request, f"Mubarak ho! {count} users ko manually verify kar diya gaya hai. ✅", messages.SUCCESS)

    make_verified.short_description = "Selected users ko 'Verified' mark karein"
    
    # Detail page mein fields add karne ke liye
    fieldsets = BaseUserAdmin.fieldsets + (
        ('Videsh Chalo Info', {'fields': ('full_name', 'is_candidate', 'is_recruiter', 'role_selected')}),
    )

# Purana registration hatao (Try-except safety ke liye)
try:
    admin.site.unregister(User)
except admin.sites.NotRegistered:
    pass

# Naya registration lagao
admin.site.register(User, MyUserAdmin)


@admin.register(RecruiterProfile)
class RecruiterProfileAdmin(admin.ModelAdmin):
    list_display = ('user', 'company_name', 'industry', 'contact_person', 'whatsapp_number', 'city', 'credits', 'is_verified')
    search_fields = ('user__username', 'company_name', 'contact_person')
    list_editable = ('credits', 'is_verified')

    def get_queryset(self, request):
        qs = super().get_queryset(request)
        return qs.filter(user__is_recruiter=True)


# ✅ 2. Baki Models (Job, Application, etc.) 
@admin.register(Job)
class JobAdmin(SortableAdminMixin, admin.ModelAdmin):
    list_display = ('sequence', 'title', 'get_favorite_count', 'applicant_count', 'industry_master', 'position', 'posted_by', 'is_approved', 'is_closed', 'is_featured', 'is_hot', 'job_code', 'country')
    list_editable = ('is_featured', 'is_hot', 'is_approved', 'is_closed')
    list_filter = ('is_approved', 'posted_by', 'country')
    list_display_links = ('title',)
    readonly_fields = ('job_code', 'industry_old', 'display_favorite_users', 'display_applied_users', 'applicant_count')
    
    fieldsets = (
        ('Basic Information', {
            'fields': ('title', 'image', 'job_code', 'vacancies', 'country', 'is_hot', 'is_featured', 'important_note', 'is_closed', 'closed_notice', 'is_approved')
        }),
        ('Applications Stats 📩', {
            'classes': ('collapse',),
            'fields': ('display_applied_users', 'applicant_count',),
        }),
        ('Favorite Stats ❤️', {
            'classes': ('collapse',),
            'fields': ('display_favorite_users',),
        }),
        ('Job Details', {
            'fields': ('age_limit', 'contract_period', 'job_type', 'industry_master', 'position', 'experience', 'language', 'salary', 'description', 'redirect_to_job')
        }),
        ('Facilities', {
            'fields': ('working_hours', 'overtime', 'day_off', 'accommodation', 'food', 'transportation', 'PCC')
        }),
        ('SEO Settings (Google Ranking)', {
            'classes': ('collapse',),
            # ✅ image_alt yahan jodh diya gaya hai
            'fields': ('meta_title', 'meta_description', 'seo_keywords', 'image_alt'),
        }),
    )

    def get_favorite_count(self, obj):
        return obj.favorites.count()
    get_favorite_count.short_description = 'Total Favorites ❤️'

    def display_favorite_users(self, obj):
        users = obj.favorites.all()
        if users:
            return ", ".join([user.username for user in users])
        return "Abhi tak kisi ne dil nahi diya 💔"
    display_favorite_users.short_description = 'Users who favorited this'

    def display_applied_users(self, obj):
        applicants = obj.applications.all()
        if applicants:
            return ", ".join([app.full_name for app in applicants])
        return "Abhi tak kisi ne apply nahi kiya."
    display_applied_users.short_description = 'Applied Candidates 👤'

    def applicant_count(self, obj):
        return obj.applications.count()
    applicant_count.short_description = 'Total Applicants 👥'

@admin.register(Application)
class ApplicationAdmin(admin.ModelAdmin):
    list_display = ('full_name', 'email', 'registration_status', 'phone', 'job', 'applied_at', 'status', 'recruiter_message', 'resume')
    list_editable = ('status',)
    list_filter = ('job', 'applied_at', 'status')
    search_fields = ('full_name', 'email', 'phone')
    fields = ('user', 'job', 'full_name', 'email', 'phone', 'resume', 'status', 'recruiter_message')

    def registration_status(self, obj):
        if obj.user:
            return mark_safe('<b style="color: #28a745;"><i class="fas fa-check-circle"></i> Registered</b>')
        return mark_safe('<span style="color: #6c757d;">Unregistered</span>')
    registration_status.short_description = 'User Type'
    
# ==========================================
# 3. ROJGAR NEWS PORTAL 📰 (NEW SECTION)
# ==========================================

@admin.register(NewsPost)
class NewsPostAdmin(admin.ModelAdmin):
    list_display = ('title', 'category', 'status', 'is_breaking', 'views_count', 'created_at')
    list_filter = ('status', 'category', 'is_breaking')
    list_editable = ('status', 'is_breaking')
    search_fields = ('title', 'content')
    prepopulated_fields = {'slug': ('title',)} # Title likhte hi slug khud banega
    
    fieldsets = (
        ('Content', {'fields': ('title', 'slug', 'image', 'content', 'short_description')}),
        ('Settings', {'fields': ('category', 'status', 'is_breaking')}),
        ('Source Info', {'fields': ('source_name', 'source_url')}),
        ('SEO Setup', {'classes': ('collapse',), 'fields': ('meta_title', 'meta_description', 'meta_keywords', 'image_alt')}),
    )

@admin.register(Profile)
class ProfileAdmin(admin.ModelAdmin):
    list_display = ('status_badge', 'user', 'last_seen', 'role_selected_status', 'candidate_status', 'recruiter_status', 'referred_by', 'other_preferred_industry', 'other_preferred_position', 'resume' , 'get_email', 'skills', 'dob', 'whatsapp_number', 'city', 'state')
    search_fields = ('user__username', 'whatsapp_number')
    list_display_links = ('user',)
    readonly_fields = ('role_selected_status', 'candidate_status', 'recruiter_status')

    def candidate_status(self, obj): return obj.user.is_candidate
    candidate_status.boolean = True
    def recruiter_status(self, obj): return obj.user.is_recruiter
    recruiter_status.boolean = True
    def role_selected_status(self, obj): return obj.user.role_selected
    role_selected_status.boolean = True

    def status_badge(self, obj):
        if obj.last_seen:
            now = timezone.now()
            if now - obj.last_seen < datetime.timedelta(seconds=300):
                return mark_safe('<span style="color: #25D366; font-weight: bold;">● Online</span>')
        return mark_safe('<span style="color: #FF0000; font-weight: bold;">● Offline</span>')
    status_badge.short_description = 'Live Status'

    def get_email(self, obj): return obj.user.email
    get_email.short_description = 'Email Address'

    def changelist_view(self, request, extra_context=None):
        total = Profile.objects.count()
        time_threshold = timezone.now() - datetime.timedelta(seconds=300)
        online = Profile.objects.filter(last_seen__gte=time_threshold).count()
        summary_html = mark_safe(f'<div style="background: #417690; color: white; padding: 10px; border-radius: 5px; margin-bottom: 10px;">📊 Stats: Total {total} | Online {online}</div>')
        self.message_user(request, summary_html)
        return super().changelist_view(request, extra_context=extra_context)
        
# ==========================================
# 7. COMMUNICATION 📞
# ==========================================

@admin.register(ContactMessage)
class ContactMessageAdmin(admin.ModelAdmin):
    list_display = ('name', 'phone', 'created_at')
    ordering = ('-created_at',)
    readonly_fields = ('name', 'phone', 'message', 'created_at')

# ==========================================
# 5. REFERRAL & WITHDRAWALS 💰
# ==========================================

# 1. REFERRAL WALLET ADMIN
# Yahan se aap dekh sakte hain kiske paas kitna balance hai
class ReferralWalletAdmin(admin.ModelAdmin):
    list_display = ('user', 'balance', 'total_earned', 'updated_at')
    search_fields = ('user__username', 'user__email')
    readonly_fields = ('updated_at',)
    ordering = ('-balance',)

# 2. TRANSACTION ADMIN
# Paisa kahan se aaya aur gaya, uska pura audit trail
class TransactionAdmin(admin.ModelAdmin):
    list_display = ('wallet_user', 'amount', 'transaction_type', 'description', 'timestamp')
    list_filter = ('transaction_type', 'timestamp')
    search_fields = ('wallet__user__username', 'description')
    readonly_fields = ('timestamp',)

    def wallet_user(self, obj):
        return obj.wallet.user.username
    wallet_user.short_description = 'User'

# 3. WITHDRAWAL REQUEST ADMIN
# Shalu ki requests yahan dikhengi, aap 'admin_note' mein message likh sakte hain
class WithdrawalRequestAdmin(admin.ModelAdmin):
    # ✅ admin_note add kiya gaya hai taaki aap user ko message bhej sakein
    list_display = ('user', 'amount', 'status', 'upi_id', 'request_date', 'payment_date')
    list_filter = ('status', 'request_date')
    search_fields = ('user__username', 'upi_id')
    list_editable = ('status',) # Seedha list se status badal sakte hain
    date_hierarchy = 'request_date'
    
    # Fields jo edit honge jab aap kisi request par click karenge
    fields = ('user', 'amount', 'upi_id', 'status', 'admin_note', 'payment_date')
    readonly_fields = ('user', 'amount', 'upi_id', 'request_date')
    
    # Custom Actions
    actions = ['mark_as_completed', 'mark_as_processing', 'mark_as_rejected']

    def mark_as_completed(self, request, queryset):
        from django.utils import timezone
        queryset.update(
            status='Completed', 
            payment_date=timezone.now(), 
            admin_note="Mauz Udaao! Paisa aapke UPI account mein bhej diya gaya hai. 👍"
        )
    mark_as_completed.short_description = "Approve & Mark as Completed"

    def mark_as_processing(self, request, queryset):
        queryset.update(
            status='Processing', 
            admin_note="Hum aapki request process kar rahe hain. maximum 24 hours ka samay lag sakta hai. ⏳"
        )
    mark_as_processing.short_description = "Set status to Processing"

    def mark_as_rejected(self, request, queryset):
        queryset.update(
            status='Rejected', 
            admin_note="Ohh! aapka UPI ID galat lag raha hai. Kripya humein contact karein. ❌"
        )
    mark_as_rejected.short_description = "Reject selected requests"
    
# ==========================================
# 6. V-COIN ECONOMY & ENGAGEMENT 🎡
# ==========================================

@admin.register(CandidateWallet)
class CandidateWalletAdmin(admin.ModelAdmin):
    list_display = ('user', 'coins', 'total_time_spent', 'is_eligible_for_time_reward')
    search_fields = ('user__username',)


# Models ko register karein
admin.site.register(ReferralWallet, ReferralWalletAdmin)
admin.site.register(Transaction, TransactionAdmin)
admin.site.register(WithdrawalRequest, WithdrawalRequestAdmin)

@admin.register(LuckyWheelActivity)
class LuckyWheelActivityAdmin(admin.ModelAdmin):
    list_display = ('user', 'spin_date', 'win_amount')
    list_filter = ('spin_date',)

@admin.register(CoinTransaction)
class CoinTransactionAdmin(admin.ModelAdmin):
    list_display = ('wallet', 'amount', 'transaction_type', 'reason', 'timestamp')
    list_filter = ('transaction_type', 'timestamp')
    
@admin.register(IndustryMaster)
class IndustryMasterAdmin(admin.ModelAdmin):
    list_display = ('name',)
    search_fields = ('name',)

# ==========================================
# 4. MASTER Trade DATA (Dropdowns) 🏗️
# ==========================================

@admin.register(TradePosition)
class TradePositionAdmin(admin.ModelAdmin):
    # ✅ Status aur Industry ke saath sundar view
    list_display = ('title', 'industry', 'is_verified')
    list_filter = ('is_verified', 'industry')
    search_fields = ('title',)
    list_editable = ('is_verified',) # Seedha list se hi click karke verify kar sakte hain!
    
    # Pehle False (Red Cross) waale aayenge, phir True waale.
    ordering = ['is_verified', '-id']
    
    # ⚡ ADMIN ACTIONS: Bulk approval ke liye
    actions = ['approve_trades', 'reject_trades']

    @admin.action(description="Verify selected trades (Add to Master)")
    def approve_trades(self, request, queryset):
        queryset.update(is_verified=True)
        self.message_user(request, "Shabaash! Selected trades ab Master List ka hissa hain. ✅")

    @admin.action(description="Mark as Unverified")
    def reject_trades(self, request, queryset):
        queryset.update(is_verified=False)
        self.message_user(request, "Trades ko Unverified mark kar diya gaya hai. ❌")
        
# ==========================================
# 5. AI COUNTRY GUIDES 🌏 (NEW SECTION)
# ==========================================

class CountryGuideForm(forms.ModelForm):
    """
    Form to handle CKEditor and bypass 'Required' error in Admin.
    """
    content_html = forms.CharField(
        widget=CKEditorWidget(), 
        required=False, 
        help_text="Bhai, ise khali chhod kar Save karenge toh AI turant naya blog bana dega."
    )
    class Meta:
        model = CountryGuide
        fields = '__all__'

@admin.register(CountryGuide)
class CountryGuideAdmin(admin.ModelAdmin):
    form = CountryGuideForm
    list_display = ('country_name', 'last_updated', 'content_snippet')
    search_fields = ('country_name', 'content_html')
    readonly_fields = ('last_updated',)

    def content_snippet(self, obj):
        if obj.content_html:
            return mark_safe(obj.content_html[:100] + "...")
        return "No Content"
    content_snippet.short_description = "Blog Preview"

    # ✅ SMART AUTO-PILOT TRIGGER: Jab content khali save ho, AI trigger ho jaye
    def save_model(self, request, obj, form, change):
        if not obj.content_html:
            self.message_user(request, f"Bhai rukiye, {obj.country_name} ke liye AI content generate ho raha hai... ⏳", messages.INFO)
            ai_content = generate_country_guide_ai(obj.country_name)
            if ai_content:
                obj.content_html = ai_content
                if not obj.meta_description:
                    obj.meta_description = f"Official Videsh Chalo Guide to Working in {obj.country_name}. Get visa and job tips."
                self.message_user(request, f"Mubarak ho! {obj.country_name} ka branded guide taiyar hai. ✅", messages.SUCCESS)
            else:
                self.message_user(request, "AI content generate nahi kar paya. Kripya Groq API check karein.", messages.ERROR)
        
        super().save_model(request, obj, form, change)
        
@admin.register(FormOTP)
class FormOTPAdmin(admin.ModelAdmin):
    list_display = ('code', 'is_used', 'created_at', 'used_at')
    list_filter = ('is_used',)
    search_fields = ('code',)
    
    # 💡 Tip: Ise add karne se aap bulk mein OTPs create kar sakenge
    actions = ['mark_as_unused']
    
    def mark_as_unused(self, request, queryset):
        queryset.update(is_used=False, used_at=None)

@admin.register(EmployerRequirement)
class EmployerRequirementAdmin(admin.ModelAdmin):
    list_display = ('company_name', 'contact_person', 'total_vacancies', 'submitted_at')
    readonly_fields = ('submitted_at',)
    search_fields = ('company_name', 'contact_person', 'positions')
    list_filter = ('submitted_at',)
    
    # Requirements ko groups mein dikhane ke liye fieldsets
    fieldsets = (
        ('Employer Info', {'fields': ('company_name', 'contact_person')}),
        ('Vacancy Details', {'fields': ('positions', 'total_vacancies', 'responsibilities', 'skills_required', 'english_level', 'working_schedule')}),
        ('Compensation', {'fields': ('salary_range', 'overtime_details', 'bonuses', 'accommodation', 'food_allowance', 'transportation')}),
        ('Legal & Contract', {'fields': ('airfare_bearer', 'visa_permit_provided', 'visa_processing_handler', 'medical_insurance', 'contract_duration', 'probation_period', 'termination_conditions', 'paid_leave')}),
        ('Living Conditions', {'fields': ('room_type', 'people_per_room', 'utilities_included')}),
        ('Final Details', {'fields': ('annual_leave_tickets', 'salary_deductions', 'arrival_support', 'restrictions', 'submitted_at')}),
    )