# Debug Test for Admin Setup Issues
# This test helps understand why admin permissions aren't working

from django.test import TestCase, override_settings
from django.core import mail
from django.contrib.auth import get_user_model
from django.contrib.auth.models import Permission
from django.contrib.contenttypes.models import ContentType
from api.utils import get_report_recipients, send_admin_report_notification
from tests.test_utils import (
    create_admin_with_report_permissions, 
    debug_permission_system,
    create_test_bazi_person
)

User = get_user_model()


class DebugAdminSetupTest(TestCase):
    """Debug test to understand admin permission issues"""
    
    def setUp(self):
        super().setUp()
        print("\n" + "="*50)
        print("DEBUG: Starting admin setup test")
        print("="*50)
    
    def test_debug_permission_system(self):
        """Test to debug the permission system step by step"""
        print("\n1. Initial state check...")
        debug_info = debug_permission_system()
        print(f"Initial recipients: {debug_info['recipients']}")
        print(f"Initial permissions found: {debug_info['permissions_found']}")
        print(f"Initial staff users: {debug_info['staff_users_count']}")
        
        print("\n2. Creating admin with permissions...")
        admin = create_admin_with_report_permissions(email='debug_admin@example.com')
        
        print("\n3. After admin creation check...")
        debug_info = debug_permission_system()
        print(f"Recipients after creation: {debug_info['recipients']}")
        print(f"Permissions found: {debug_info['permissions_found']}")
        print(f"Staff users: {debug_info['staff_users_count']}")
        
        for detail in debug_info['staff_user_details']:
            print(f"Staff user: {detail}")
        
        for perm_detail in debug_info['permission_details']:
            print(f"Permission: {perm_detail}")
        
        # Manual check
        print("\n4. Manual verification...")
        permission = Permission.objects.get(codename='can_receive_ai_report_emails')
        print(f"Permission ID: {permission.id}")
        print(f"Permission content type: {permission.content_type}")
        
        # Check if admin has permission
        has_permission = admin.user_permissions.filter(
            codename='can_receive_ai_report_emails'
        ).exists()
        print(f"Admin has permission (direct check): {has_permission}")
        
        # Check with the exact query from get_report_recipients
        query_result = User.objects.filter(
            is_staff=True,
            user_permissions=permission,
            email__isnull=False,
            is_active=True
        ).exclude(email='')
        
        print(f"Query result count: {query_result.count()}")
        for user in query_result:
            print(f"Query result user: {user.email}")
        
        # This should now work
        recipients = get_report_recipients()
        print(f"Final recipients: {recipients}")
        self.assertIn('debug_admin@example.com', recipients)
    
    @override_settings(EMAIL_BACKEND='django.core.mail.backends.locmem.EmailBackend')
    def test_complete_flow_with_debug(self):
        """Test the complete flow from admin creation to email sending"""
        print("\n" + "="*50)
        print("DEBUG: Testing complete flow")
        print("="*50)
        
        # Step 1: Create admin
        print("\n1. Creating admin...")
        admin = create_admin_with_report_permissions(email='flow_admin@example.com')
        
        # Step 2: Create test user and person
        print("\n2. Creating test data...")
        test_user = User.objects.create_user(
            phone='13800000999',
            email='testuser@example.com',
            password='testpass123'
        )
        
        test_person = create_test_bazi_person(user=test_user, name="Debug Test Person")
        
        # Step 3: Check recipients
        print("\n3. Checking recipients...")
        recipients = get_report_recipients()
        print(f"Recipients: {recipients}")
        self.assertEqual(len(recipients), 1)
        self.assertIn('flow_admin@example.com', recipients)
        
        # Step 4: Send notification
        print("\n4. Sending notification...")
        success = send_admin_report_notification(
            analysis_obj=test_person,
            analysis_type='bazi',
            category='inappropriate_content',
            user_message='This is a debug test message'
        )
        
        print(f"Send result: {success}")
        print(f"Mail outbox count: {len(mail.outbox)}")
        
        if mail.outbox:
            email = mail.outbox[0]
            print(f"Email to: {email.to}")
            print(f"Email subject: {email.subject}")
        
        # Assertions
        self.assertTrue(success, "Email sending should succeed")
        self.assertEqual(len(mail.outbox), 1, "Should have sent exactly one email")
        self.assertIn('flow_admin@example.com', mail.outbox[0].to)
    
    def test_manual_permission_setup(self):
        """Test manual permission setup to understand the exact issue"""
        print("\n" + "="*50)
        print("DEBUG: Manual permission setup")
        print("="*50)
        
        # Create user manually
        admin = User.objects.create_user(
            phone='13800000888',
            email='manual_admin@example.com',
            is_staff=True,
            is_active=True
        )
        print(f"Created admin: {admin.id}, staff: {admin.is_staff}, email: {admin.email}")
        
        # Get correct content type
        user_content_type = ContentType.objects.get_for_model(User)
        print(f"User content type: {user_content_type}")
        
        # Create permission manually
        permission, created = Permission.objects.get_or_create(
            codename='can_receive_ai_report_emails',
            defaults={
                'name': 'Can receive AI analysis report emails',
                'content_type': user_content_type
            }
        )
        print(f"Permission: {permission.id}, created: {created}")
        print(f"Permission content type: {permission.content_type}")
        
        # Add permission to user
        admin.user_permissions.add(permission)
        print("Permission added to user")
        
        # Verify permission
        user_perms = admin.user_permissions.all()
        print(f"User permissions count: {user_perms.count()}")
        for perm in user_perms:
            print(f"  Permission: {perm.codename} (ID: {perm.id})")
        
        # Test the query directly
        print("\nTesting query directly...")
        matching_users = User.objects.filter(
            is_staff=True,
            user_permissions=permission,
            email__isnull=False,
            is_active=True
        ).exclude(email='')
        
        print(f"Matching users count: {matching_users.count()}")
        for user in matching_users:
            print(f"  User: {user.email} (ID: {user.id})")
        
        # Test get_report_recipients
        recipients = get_report_recipients()
        print(f"get_report_recipients result: {recipients}")
        
        self.assertIn('manual_admin@example.com', recipients)


class QuickFixTest(TestCase):
    """Test the quick fix approach"""
    
    @override_settings(EMAIL_BACKEND='django.core.mail.backends.locmem.EmailBackend')
    def test_quick_fix_approach(self):
        """Test using the simplified quick fix approach"""
        print("\n" + "="*50)
        print("QUICK FIX: Testing simplified approach")
        print("="*50)
        
        # Quick one-liner setup
        admin = create_admin_with_report_permissions()
        
        # Verify it works
        recipients = get_report_recipients()
        print(f"Quick fix recipients: {recipients}")
        
        self.assertEqual(len(recipients), 1)
        self.assertIn('test_admin@example.com', recipients)
        
        # Test with notification
        test_user = User.objects.create_user(
            phone='13800000777',
            email='quicktest@example.com'
        )
        
        test_person = create_test_bazi_person(user=test_user)
        
        success = send_admin_report_notification(
            analysis_obj=test_person,
            analysis_type='bazi',
            category='technical_error',
            user_message='Quick fix test'
        )
        
        print(f"Quick fix success: {success}")
        print(f"Quick fix emails sent: {len(mail.outbox)}")
        
        self.assertTrue(success)
        self.assertEqual(len(mail.outbox), 1) 