import pytest
from unittest.mock import Mock, patch, MagicMock
from flask_login import FlaskLoginClient

def test_trigger_email_processing_success(client, auth):
    """Test successful email processing trigger."""
    # Login as a user
    auth.login()
    
    # Mock the EmailProcessor
    with patch('app.routes.background_processing.EmailProcessor') as mock_processor:
        mock_processor_instance = mock_processor.return_value
        mock_processor_instance.process_user_emails.return_value = {
            'success_count': 5,
            'error_count': 0,
            'processed_folders': []
        }
        
        # Make the request
        response = client.post('/api/background/process-emails')
        
        # Verify response
        assert response.status_code == 200
        json_data = response.get_json()
        assert json_data['success'] is True
        assert 'Processed 5 emails successfully' in json_data['message']

def test_trigger_email_processing_unauthorized(client):
    """Test email processing trigger without authentication."""
    # Make the request without logging in
    response = client.post('/api/background/process-emails')
    
    # Verify response (should redirect to login)
    assert response.status_code == 302  # Redirect to login

def test_trigger_folder_processing_success(client, auth, app):
    """Test successful folder processing trigger."""
    # Login as a user
    auth.login()
    
    # Create a mock folder for the current user
    with app.app_context():
        from app.models import User, Folder
        from app import db
        
        # Get or create test user
        user = User.query.filter_by(email='test@example.com').first()
        if not user:
            user = User(
                first_name='Test',
                last_name='User',
                email='test@example.com',
                password_hash='hashed_password'
            )
            db.session.add(user)
            
        # Create test folder
        folder = Folder(
            user_id=user.id,
            name='Test Folder',
            rule_text='move to Archive',
            priority=1
        )
        db.session.add(folder)
        db.session.commit()
        folder_id = folder.id
    
    # Mock the EmailProcessor
    with patch('app.routes.background_processing.EmailProcessor') as mock_processor:
        mock_processor_instance = mock_processor.return_value
        mock_processor_instance.process_folder_emails.return_value = {
            'processed_count': 3,
            'error_count': 0
        }
        
        # Make the request
        response = client.post(f'/api/background/process-folder/{folder_id}')
        
        # Verify response
        assert response.status_code == 200
        json_data = response.get_json()
        assert json_data['success'] is True
        assert 'Processed 3 emails for folder Test Folder' in json_data['message']
    
    # Cleanup
    with app.app_context():
        from app.models import db, Folder
        folder = Folder.query.get(folder_id)
        if folder:
            db.session.delete(folder)
            db.session.commit()

def test_trigger_folder_processing_not_found(client, auth):
    """Test folder processing trigger with non-existent folder."""
    # Login as a user
    auth.login()
    
    # Make the request with non-existent folder ID
    response = client.post('/api/background/process-folder/999')
    
    # Verify response
    assert response.status_code == 404
    json_data = response.get_json()
    assert json_data['success'] is False
    assert 'Folder not found or access denied' in json_data['error']

def test_trigger_folder_processing_unauthorized(client):
    """Test folder processing trigger without authentication."""
    # Make the request without logging in
    response = client.post('/api/background/process-folder/1')
    
    # Verify response (should redirect to login)
    assert response.status_code == 302  # Redirect to login