from django.contrib import admin
from django.utils.html import format_html
from django.utils.safestring import mark_safe
from django.urls import path, reverse
from django.http import HttpResponseRedirect
from django.contrib import messages
import json
from .models import Person

def generate_ai_analysis(modeladmin, request, queryset):
    """Admin action to generate AI analysis for selected people"""
    for person in queryset:
        try:
            # Import here to avoid circular imports
            from ai.utils.bazi import analyze_bazi
            analyze_bazi(person)
        except Exception as e:
            modeladmin.message_user(request, f"Error generating analysis for {person.name}: {str(e)}")
    modeladmin.message_user(request, f"Analysis requested for {queryset.count()} people")
generate_ai_analysis.short_description = "Generate AI analysis"

def reset_ai_analysis(modeladmin, request, queryset):
    """Admin action to reset AI analysis for selected people"""
    updated_count = 0
    for person in queryset:
        person.ai_analysis = None
        person.analysis_timestamp = None
        person.analysis_status = None
        person.save(update_fields=['ai_analysis', 'analysis_timestamp', 'analysis_status'])
        updated_count += 1
    
    modeladmin.message_user(request, f"AI analysis reset for {updated_count} people. You can now regenerate their analysis.")
reset_ai_analysis.short_description = "Reset AI analysis (allows regeneration)"

@admin.register(Person)
class PersonAdmin(admin.ModelAdmin):
    list_display = ('name', 'birth_date', 'birth_time', 'created_by_display', 'created_at', 'analysis_status_display', 'bazi_report_status_display', 'number_report_status_display')
    list_filter = ('created_at', 'created_by', 'analysis_status', 'bazi_report_status', 'number_report_status', 'bazi_analysis_reported', 'number_analysis_reported')
    search_fields = ('name', 'notes', 'created_by__first_name', 'created_by__last_name', 'created_by__phone', 'bazi_report_message', 'number_report_message')
    readonly_fields = ('created_at', 'updated_at', 'created_by', 'analysis_timestamp', 'analysis_status', 'ai_analysis_display', 'reset_ai_analysis_button', 'number_ai_analysis_display', 'reset_number_ai_analysis_button', 'bazi_report_timestamp', 'bazi_report_resolved_by', 'bazi_report_resolved_at', 'number_report_timestamp', 'number_report_resolved_by', 'number_report_resolved_at')
    actions = [generate_ai_analysis, reset_ai_analysis, 'resolve_bazi_reports', 'resolve_number_reports']
    
    fieldsets = (
        ('Basic Information', {
            'fields': ('name', 'gender', 'birth_date', 'birth_time', 'twin_type', 'father_dob', 'mother_dob', 'notes')
        }),
        ('Chart Data', {
            'fields': ('bazi_result', 'number_result')
        }),
        ('BaZi AI Analysis', {
            'fields': ('analysis_status', 'analysis_timestamp', 'ai_analysis_display', 'reset_ai_analysis_button')
        }),
        ('Number AI Analysis', {
            'fields': ('number_analysis_status', 'number_analysis_timestamp', 'number_ai_analysis_display', 'reset_number_ai_analysis_button')
        }),
        ('BaZi Analysis Reports', {
            'fields': ('bazi_analysis_reported', 'bazi_report_category', 'bazi_report_message', 'bazi_report_timestamp', 'bazi_report_status', 'bazi_report_admin_notes', 'bazi_report_resolved_at'),
            'classes': ('collapse',)
        }),
        ('Number Analysis Reports', {
            'fields': ('number_analysis_reported', 'number_report_category', 'number_report_message', 'number_report_timestamp', 'number_report_status', 'number_report_admin_notes', 'number_report_resolved_at'),
            'classes': ('collapse',)
        }),
        ('System', {
            'fields': ('created_at', 'updated_at', 'created_by')
        }),
    )
    
    def save_model(self, request, obj, form, change):
        """Override save_model to send email notifications when report status changes"""
        from django.utils import timezone
        
        # Check if BaZi report checkbox was unchecked (reset scenario)
        if change and 'bazi_analysis_reported' in form.changed_data:
            old_reported = form.initial.get('bazi_analysis_reported', False)
            new_reported = form.cleaned_data.get('bazi_analysis_reported', False)
            
            # If checkbox was unchecked, reset the email flag
            if old_reported and not new_reported:
                obj.bazi_report_resolution_email_sent = False
                self.message_user(request, "BaZi report reset - email flag cleared for new report")
        
        # Check if Number report checkbox was unchecked (reset scenario)
        if change and 'number_analysis_reported' in form.changed_data:
            old_reported = form.initial.get('number_analysis_reported', False)
            new_reported = form.cleaned_data.get('number_analysis_reported', False)
            
            # If checkbox was unchecked, reset the email flag
            if old_reported and not new_reported:
                obj.number_report_resolution_email_sent = False
                self.message_user(request, "Number report reset - email flag cleared for new report")
        
        # Check if this is a BaZi report status change
        if change and 'bazi_report_status' in form.changed_data:
            old_status = form.initial.get('bazi_report_status', '')
            new_status = form.cleaned_data.get('bazi_report_status', '')
            
            # Set resolver and timestamp for both resolved and dismissed
            if new_status in ['resolved', 'dismissed']:
                obj.bazi_report_resolved_by = request.user
                obj.bazi_report_resolved_at = timezone.now()
            
            # If status changed to resolved (send email only once per report)
            if new_status == 'resolved' and not obj.bazi_report_resolution_email_sent:
                # Send notification email to user
                try:
                    from api.utils import send_user_resolution_notification
                    if obj.created_by and obj.created_by.email:
                        send_user_resolution_notification(
                            obj.created_by, obj, 'bazi', new_status, obj.bazi_report_admin_notes
                        )
                        obj.bazi_report_resolution_email_sent = True
                        self.message_user(request, f"Email notification sent to {obj.created_by.email}")
                except Exception as e:
                    self.message_user(request, f"Report status updated but email failed: {str(e)}")
        
        # Check if this is a Number report status change
        if change and 'number_report_status' in form.changed_data:
            old_status = form.initial.get('number_report_status', '')
            new_status = form.cleaned_data.get('number_report_status', '')
            
            # Set resolver and timestamp for both resolved and dismissed
            if new_status in ['resolved', 'dismissed']:
                obj.number_report_resolved_by = request.user
                obj.number_report_resolved_at = timezone.now()
            
            # If status changed to resolved (send email only once per report)
            if new_status == 'resolved' and not obj.number_report_resolution_email_sent:
                # Send notification email to user
                try:
                    from api.utils import send_user_resolution_notification
                    if obj.created_by and obj.created_by.email:
                        send_user_resolution_notification(
                            obj.created_by, obj, 'number', new_status, obj.number_report_admin_notes
                        )
                        obj.number_report_resolution_email_sent = True
                        self.message_user(request, f"Email notification sent to {obj.created_by.email}")
                except Exception as e:
                    self.message_user(request, f"Report status updated but email failed: {str(e)}")
        
        # Call the parent save_model
        super().save_model(request, obj, form, change)
    
    def get_urls(self):
        """Add custom URLs for the reset functionality."""
        urls = super().get_urls()
        custom_urls = [
            path(
                '<int:person_id>/reset-ai-analysis/',
                self.admin_site.admin_view(self.reset_ai_analysis_view),
                name='bazi_person_reset_ai_analysis',
            ),
            path(
                '<int:person_id>/reset-number-ai-analysis/',
                self.admin_site.admin_view(self.reset_number_ai_analysis_view),
                name='bazi_person_reset_number_ai_analysis',
            ),
        ]
        return custom_urls + urls
    
    def reset_ai_analysis_view(self, request, person_id):
        """Custom view to handle BaZi AI analysis reset for individual person."""
        try:
            person = Person.objects.get(id=person_id)
        except Person.DoesNotExist:
            messages.error(request, f"Person with ID {person_id} does not exist.")
            return HttpResponseRedirect(reverse('admin:bazi_person_changelist'))
        
        # Reset the BaZi AI analysis
        person.ai_analysis = None
        person.analysis_timestamp = None
        person.analysis_status = None
        person.save(update_fields=['ai_analysis', 'analysis_timestamp', 'analysis_status'])
        
        messages.success(request, f"BaZi AI analysis reset for {person.name}. You can now regenerate their BaZi analysis.")
        
        # Redirect back to the person's change page
        return HttpResponseRedirect(reverse('admin:bazi_person_change', args=[person_id]))
    
    def reset_number_ai_analysis_view(self, request, person_id):
        """Custom view to handle Number AI analysis reset for individual person."""
        try:
            person = Person.objects.get(id=person_id)
        except Person.DoesNotExist:
            messages.error(request, f"Person with ID {person_id} does not exist.")
            return HttpResponseRedirect(reverse('admin:bazi_person_changelist'))
        
        # Reset the Number AI analysis
        person.number_ai_analysis = None
        person.number_analysis_timestamp = None
        person.number_analysis_status = None
        person.save(update_fields=['number_ai_analysis', 'number_analysis_timestamp', 'number_analysis_status'])
        
        messages.success(request, f"Number AI analysis reset for {person.name}. You can now regenerate their Number analysis.")
        
        # Redirect back to the person's change page
        return HttpResponseRedirect(reverse('admin:bazi_person_change', args=[person_id]))
    
    def reset_ai_analysis_button(self, obj):
        """Display a reset button for AI analysis on the individual person's change page."""
        if not obj.pk:  # New object, no reset needed
            return "Save the person first to enable AI analysis reset."
        
        if not obj.ai_analysis:
            return format_html(
                '<span style="color: #666; font-style: italic;">No AI analysis to reset</span>'
            )
        
        reset_url = reverse('admin:bazi_person_reset_ai_analysis', args=[obj.pk])
        return format_html(
            '<a href="{}" class="button" style="background-color: #dc3545; color: white; padding: 8px 12px; '
            'text-decoration: none; border-radius: 4px; font-size: 13px; display: inline-block; margin-top: 5px;" '
            'onclick="return confirm(\'Are you sure you want to reset the AI analysis for {}? This will clear all analysis data and allow regeneration.\');">'
            '🗑️ Reset AI Analysis</a>',
            reset_url,
            obj.name
        )
    reset_ai_analysis_button.short_description = 'Reset BaZi AI Analysis'
    
    def reset_number_ai_analysis_button(self, obj):
        """Display a reset button for Number AI analysis on the individual person's change page."""
        if not obj.pk:  # New object, no reset needed
            return "Save the person first to enable Number AI analysis reset."
        
        if not obj.number_ai_analysis:
            return format_html(
                '<span style="color: #666; font-style: italic;">No Number AI analysis to reset</span>'
            )
        
        reset_url = reverse('admin:bazi_person_reset_number_ai_analysis', args=[obj.pk])
        return format_html(
            '<a href="{}" class="button" style="background-color: #dc3545; color: white; padding: 8px 12px; '
            'text-decoration: none; border-radius: 4px; font-size: 13px; display: inline-block; margin-top: 5px;" '
            'onclick="return confirm(\'Are you sure you want to reset the Number AI analysis for {}? This will clear all Number analysis data and allow regeneration.\');">'
            '🗑️ Reset Number AI Analysis</a>',
            reset_url,
            obj.name
        )
    reset_number_ai_analysis_button.short_description = 'Reset Number AI Analysis'
    
    def created_by_display(self, obj):
        """Display the created_by user's name and phone number"""
        if not obj.created_by:
            return 'Unknown User'
        
        # Get user's full name
        full_name = f"{obj.created_by.first_name} {obj.created_by.last_name}".strip()
        if not full_name:
            full_name = "No Name"
        
        return format_html(
            '<strong>{}</strong><br><small style="color: #666;">{}</small>',
            full_name,
            obj.created_by.phone
        )
    created_by_display.short_description = 'Added By'
    created_by_display.admin_order_field = 'created_by__first_name'
    
    def analysis_status_display(self, obj):
        """Format the analysis status with colors"""
        if obj.analysis_status == 'completed':
            return format_html('<span style="color: green;">✓ Completed</span>')
        elif obj.analysis_status == 'pending':
            return format_html('<span style="color: orange;">⟳ Pending</span>')
        elif obj.analysis_status == 'error':
            return format_html('<span style="color: red;">✗ Error</span>')
        else:
            return 'Not Analyzed'
    analysis_status_display.short_description = 'Analysis Status'
    
    def ai_analysis_display(self, obj):
        """Format the AI analysis in a readable way similar to person_detail.html"""
        if not obj.ai_analysis:
            return 'No analysis available'
        
        try:
            analysis_data = obj.ai_analysis
            
            # Get the analysis content
            analysis_content = analysis_data.get('bazi_analysis', '')
            provider = analysis_data.get('provider', 'Unknown')
            model = analysis_data.get('model', 'Unknown')
            prompt = analysis_data.get('prompt', '')
            thinking = analysis_data.get('think', '')
            timestamp = obj.analysis_timestamp.strftime('%Y-%m-%d %H:%M:%S') if obj.analysis_timestamp else 'Unknown'
            
            html_sections = []
            
            # Try to parse analysis content as JSON for structured display
            if analysis_content and isinstance(analysis_content, str):
                try:
                    analysis_obj = json.loads(analysis_content)
                    if isinstance(analysis_obj, dict):
                        # Map of section keys to display names (optional mapping)
                        section_titles_mapping = {
                            'personality_analysis': '性格分析',
                            'life_structure': '生活结构与平衡',
                            'career_wealth': '事业与财富展望',
                            'relationships': '人际关系与兼容性',
                            'health': '健康考量',
                            'life_trajectory': '人生轨迹',
                            'current_influences': '当前影响',
                            'special_elements': '特殊元素',
                            'practical_recommendations': '实用建议'
                        }
                        
                        # Process ALL sections found in analysis data dynamically
                        for key, content in analysis_obj.items():
                            if content and str(content).strip():  # Only show non-empty sections
                                # Use mapping if available, otherwise use the key as-is
                                title = section_titles_mapping.get(key, key)
                                
                                # Limit content length for admin display
                                content_str = str(content)
                                if len(content_str) > 300:
                                    content_str = content_str[:300] + '...'
                                
                                html_sections.append(f"""
                                    <div style="margin-bottom: 15px; padding: 10px; border-left: 3px solid #007cba; background-color: #f8f9fa;">
                                        <h4 style="margin: 0 0 8px 0; color: #007cba; font-size: 14px;">{title}</h4>
                                        <div style="font-size: 12px; line-height: 1.4;">{content_str}</div>
                                    </div>
                                """)
                    else:
                        # Not a structured JSON, display as text
                        content = str(analysis_content)
                        if len(content) > 500:
                            content = content[:500] + '...'
                        html_sections.append(f'<div style="font-size: 12px; line-height: 1.4;">{content}</div>')
                        
                except json.JSONDecodeError:
                    # Not valid JSON, display as plain text
                    content = str(analysis_content)
                    if len(content) > 500:
                        content = content[:500] + '...'
                    html_sections.append(f'<div style="font-size: 12px; line-height: 1.4;">{content}</div>')
                    
            elif isinstance(analysis_content, dict):
                # Already a dict (new format)
                section_titles_mapping = {
                    'personality_analysis': '性格分析',
                    'life_structure': '生活结构与平衡',
                    'career_wealth': '事业与财富展望',
                    'relationships': '人际关系与兼容性',
                    'health': '健康考量',
                    'life_trajectory': '人生轨迹',
                    'current_influences': '当前影响',
                    'special_elements': '特殊元素',
                    'practical_recommendations': '实用建议'
                }
                
                # Process ALL sections found in analysis data dynamically
                for key, content in analysis_content.items():
                    if content and str(content).strip():  # Only show non-empty sections
                        # Use mapping if available, otherwise use the key as-is
                        title = section_titles_mapping.get(key, key)
                        
                        # Limit content length for admin display
                        content_str = str(content)
                        if len(content_str) > 300:
                            content_str = content_str[:300] + '...'
                        
                        html_sections.append(f"""
                            <div style="margin-bottom: 15px; padding: 10px; border-left: 3px solid #007cba; background-color: #f8f9fa;">
                                <h4 style="margin: 0 0 8px 0; color: #007cba; font-size: 14px;">{title}</h4>
                                <div style="font-size: 12px; line-height: 1.4;">{content_str}</div>
                            </div>
                        """)
            else:
                html_sections.append('<div style="color: #666;">No structured analysis content available</div>')
            
            # Add AI thinking process if available
            if thinking:
                thinking_content = str(thinking)
                if len(thinking_content) > 800:
                    thinking_content = thinking_content[:800] + '...'
                
                html_sections.append(f"""
                    <div style="margin-bottom: 15px; padding: 10px; border-left: 3px solid #17a2b8; background-color: #e7f3ff;">
                        <h4 style="margin: 0 0 8px 0; color: #17a2b8; font-size: 14px;">🧠 AI思考过程</h4>
                        <div style="font-size: 11px; line-height: 1.4; font-family: monospace; white-space: pre-wrap; max-height: 200px; overflow-y: auto; background-color: #f8f9fa; padding: 8px; border-radius: 3px;">{thinking_content}</div>
                    </div>
                """)
            
            # Add prompt if available
            if prompt:
                prompt_content = str(prompt)
                
                html_sections.append(f"""
                    <div style="margin-bottom: 15px; padding: 10px; border-left: 3px solid #28a745; background-color: #e8f5e8;">
                        <h4 style="margin: 0 0 8px 0; color: #28a745; font-size: 14px;">📝 分析提示词</h4>
                        <div style="font-size: 11px; line-height: 1.4; font-family: monospace; white-space: pre-wrap; max-height: 400px; overflow-y: auto; background-color: #f8f9fa; padding: 8px; border-radius: 3px;">{prompt_content}</div>
                    </div>
                """)
            
            # Add metadata section
            metadata_html = f"""
                <div style="margin-top: 20px; padding: 10px; background-color: #e9ecef; border-radius: 4px;">
                    <div style="font-size: 11px; color: #6c757d;">
                        <strong>Provider:</strong> {provider}<br>
                        <strong>Model:</strong> {model}<br>
                        <strong>Generated:</strong> {timestamp}
                    </div>
                </div>
            """
            
            # Combine all sections
            full_html = ''.join(html_sections) + metadata_html
            
            return mark_safe(f'<div style="max-width: 800px;">{full_html}</div>')
            
        except Exception as e:
            return format_html('<span style="color: red;">Error displaying analysis: {}</span>', str(e))
    
    ai_analysis_display.short_description = 'BaZi AI Analysis'
    
    def number_ai_analysis_display(self, obj):
        """Format the Number AI analysis in a readable way"""
        if not obj.number_ai_analysis:
            return 'No Number analysis available'
        
        try:
            analysis_data = obj.number_ai_analysis
            
            # Get the analysis content
            analysis_content = analysis_data.get('number_analysis', '')
            provider = analysis_data.get('provider', 'Unknown')
            model = analysis_data.get('model', 'Unknown')
            timestamp = obj.number_analysis_timestamp.strftime('%Y-%m-%d %H:%M:%S') if obj.number_analysis_timestamp else 'Unknown'
            
            html_sections = []
            
            # Try to parse analysis content as JSON for structured display
            if analysis_content and isinstance(analysis_content, str):
                try:
                    analysis_obj = json.loads(analysis_content)
                    if isinstance(analysis_obj, dict):
                        # Map of section keys to display names for Number analysis
                        section_titles_mapping = {
                            'number_meaning': '数字含义',
                            'personal_insights': '个人洞察',
                            'life_patterns': '生活模式',
                            'numerological_guidance': '数字学指导',
                            'practical_applications': '实际应用',
                            'energy_analysis': '能量分析',
                            'compatibility': '兼容性',
                            'recommendations': '建议'
                        }
                        
                        # Process ALL sections found in analysis data dynamically
                        for key, content in analysis_obj.items():
                            if content and str(content).strip():  # Only show non-empty sections
                                # Use mapping if available, otherwise use the key as-is
                                title = section_titles_mapping.get(key, key)
                                
                                # Limit content length for admin display
                                content_str = str(content)
                                if len(content_str) > 300:
                                    content_str = content_str[:300] + '...'
                                
                                html_sections.append(f"""
                                    <div style="margin-bottom: 15px; padding: 10px; border-left: 3px solid #28a745; background-color: #f8f9fa;">
                                        <h4 style="margin: 0 0 8px 0; color: #28a745; font-size: 14px;">{title}</h4>
                                        <div style="font-size: 12px; line-height: 1.4;">{content_str}</div>
                                    </div>
                                """)
                    else:
                        # Not a structured JSON, display as text
                        content = str(analysis_content)
                        if len(content) > 500:
                            content = content[:500] + '...'
                        html_sections.append(f'<div style="font-size: 12px; line-height: 1.4;">{content}</div>')
                        
                except json.JSONDecodeError:
                    # Not valid JSON, display as plain text
                    content = str(analysis_content)
                    if len(content) > 500:
                        content = content[:500] + '...'
                    html_sections.append(f'<div style="font-size: 12px; line-height: 1.4;">{content}</div>')
                    
            elif isinstance(analysis_content, dict):
                # Already a dict (new format)
                section_titles_mapping = {
                    'number_meaning': '数字含义',
                    'personal_insights': '个人洞察',
                    'life_patterns': '生活模式',
                    'numerological_guidance': '数字学指导',
                    'practical_applications': '实际应用',
                    'energy_analysis': '能量分析',
                    'compatibility': '兼容性',
                    'recommendations': '建议'
                }
                
                for key, content in analysis_content.items():
                    if content and str(content).strip():
                        title = section_titles_mapping.get(key, key)
                        content_str = str(content)
                        if len(content_str) > 300:
                            content_str = content_str[:300] + '...'
                        
                        html_sections.append(f"""
                            <div style="margin-bottom: 15px; padding: 10px; border-left: 3px solid #28a745; background-color: #f8f9fa;">
                                <h4 style="margin: 0 0 8px 0; color: #28a745; font-size: 14px;">{title}</h4>
                                <div style="font-size: 12px; line-height: 1.4;">{content_str}</div>
                            </div>
                        """)
            else:
                # Fallback for other formats
                content = str(analysis_content)
                if len(content) > 500:
                    content = content[:500] + '...'
                html_sections.append(f'<div style="font-size: 12px; line-height: 1.4;">{content}</div>')
            
            # Build the complete HTML
            metadata_html = f"""
                <div style="background-color: #f8f9fa; padding: 10px; margin-top: 10px; border-radius: 4px; border-left: 3px solid #28a745;">
                    <small style="color: #666;">
                        <strong>Provider:</strong> {provider}<br>
                        <strong>Model:</strong> {model}<br>
                        <strong>Generated:</strong> {timestamp}
                    </small>
                </div>
            """
            
            return mark_safe(f'<div style="max-width: 600px;">{"".join(html_sections)}{metadata_html}</div>')
            
        except Exception as e:
            return format_html('<span style="color: red;">Error displaying Number analysis: {}</span>', str(e))
    
    number_ai_analysis_display.short_description = 'Number AI Analysis'
    
    # Report status display methods
    def bazi_report_status_display(self, obj):
        """Display BaZi report status with color coding"""
        if not obj.bazi_analysis_reported:
            return format_html('<span style="color: #666;">无举报</span>')
        
        status = obj.bazi_report_status
        if status == 'pending':
            return format_html('<span style="color: orange; font-weight: bold;">⏳ 待处理</span>')
        elif status == 'reviewed':
            return format_html('<span style="color: blue; font-weight: bold;">👁️ 已审核</span>')
        elif status == 'resolved':
            return format_html('<span style="color: green; font-weight: bold;">✅ 已解决</span>')
        elif status == 'dismissed':
            return format_html('<span style="color: gray; font-weight: bold;">❌ 已忽略</span>')
        else:
            return format_html('<span style="color: red;">🚩 已举报</span>')
    bazi_report_status_display.short_description = 'BaZi举报状态'
    
    def number_report_status_display(self, obj):
        """Display Number report status with color coding"""
        if not obj.number_analysis_reported:
            return format_html('<span style="color: #666;">无举报</span>')
        
        status = obj.number_report_status
        if status == 'pending':
            return format_html('<span style="color: orange; font-weight: bold;">⏳ 待处理</span>')
        elif status == 'reviewed':
            return format_html('<span style="color: blue; font-weight: bold;">👁️ 已审核</span>')
        elif status == 'resolved':
            return format_html('<span style="color: green; font-weight: bold;">✅ 已解决</span>')
        elif status == 'dismissed':
            return format_html('<span style="color: gray; font-weight: bold;">❌ 已忽略</span>')
        else:
            return format_html('<span style="color: red;">🚩 已举报</span>')
    number_report_status_display.short_description = '数字举报状态'
    
    # Admin actions for resolving reports
    def resolve_bazi_reports(self, request, queryset):
        """Admin action to mark BaZi reports as resolved"""
        from django.utils import timezone
        updated = 0
        for person in queryset.filter(bazi_analysis_reported=True, bazi_report_status='pending'):
            person.bazi_report_status = 'resolved'
            person.bazi_report_resolved_by = request.user
            person.bazi_report_resolved_at = timezone.now()
            person.save(update_fields=[
                'bazi_report_status',
                'bazi_report_resolved_by', 'bazi_report_resolved_at',
                'bazi_report_resolution_email_sent'
            ])
            updated += 1
            
            # Send notification email to user (only if not already sent)
            if not person.bazi_report_resolution_email_sent:
                try:
                    from api.utils import send_user_resolution_notification
                    if person.created_by and person.created_by.email:
                        send_user_resolution_notification(
                            person.created_by, person, 'bazi', 'resolved', person.bazi_report_admin_notes
                        )
                        person.bazi_report_resolution_email_sent = True
                except Exception as e:
                    self.message_user(request, f"Report resolved but email failed for {person.name}: {str(e)}")
        
        self.message_user(request, f"已解决 {updated} 个BaZi分析举报")
    resolve_bazi_reports.short_description = "解决选中的BaZi举报"
    
    def resolve_number_reports(self, request, queryset):
        """Admin action to mark Number reports as resolved"""
        from django.utils import timezone
        updated = 0
        for person in queryset.filter(number_analysis_reported=True, number_report_status='pending'):
            person.number_report_status = 'resolved'
            person.number_report_resolved_by = request.user
            person.number_report_resolved_at = timezone.now()
            
            # Send notification email to user (only if not already sent)
            if not person.number_report_resolution_email_sent:
                try:
                    from api.utils import send_user_resolution_notification
                    if person.created_by and person.created_by.email:
                        send_user_resolution_notification(
                            person.created_by, person, 'number', 'resolved', person.number_report_admin_notes
                        )
                        person.number_report_resolution_email_sent = True
                except Exception as e:
                    self.message_user(request, f"Report resolved but email failed for {person.name}: {str(e)}")
            
            person.save(update_fields=[
                'number_report_status',
                'number_report_resolved_by', 'number_report_resolved_at',
                'number_report_resolution_email_sent'
            ])
            updated += 1
        
        self.message_user(request, f"已解决 {updated} 个数字分析举报")
    resolve_number_reports.short_description = "解决选中的数字举报"
