"""Testes para as rotas de chat."""

import pytest
from src.models import Chat, Message
from datetime import datetime

def test_create_chat(client, auth_headers, test_agent):
    """Testa criação de um novo chat."""
    response = client.post('/chat', json={
        'agent_id': test_agent.id,
        'message': 'Hello, agent!'
    }, headers=auth_headers)
    
    assert response.status_code == 200
    assert 'chat_id' in response.json
    assert 'message_id' in response.json
    
    chat = Chat.query.filter_by(agent_id=test_agent.id).first()
    assert chat is not None
    assert chat.user_id is not None

def test_send_message(client, auth_headers, test_chat):
    """Testa envio de mensagem em um chat existente."""
    response = client.post(f'/chat/{test_chat.id}/message', json={
        'message': 'Hello, agent!'
    }, headers=auth_headers)
    
    assert response.status_code == 200
    assert 'message_id' in response.json
    
    message = Message.query.filter_by(chat_id=test_chat.id).first()
    assert message is not None
    assert message.message == 'Hello, agent!'

def test_get_chat_history(client, auth_headers, test_chat, test_message):
    """Testa obtenção do histórico de chat."""
    response = client.get(f'/chat/{test_chat.id}/history', headers=auth_headers)
    
    assert response.status_code == 200
    assert 'messages' in response.json
    assert len(response.json['messages']) > 0
    assert response.json['messages'][0]['message'] == 'Test message'

def test_get_chat_list(client, auth_headers, test_chat):
    """Testa listagem de chats do usuário."""
    response = client.get('/chats', headers=auth_headers)
    
    assert response.status_code == 200
    assert 'chats' in response.json
    assert len(response.json['chats']) > 0
    assert response.json['chats'][0]['id'] == test_chat.id

def test_delete_chat(client, auth_headers, test_chat):
    """Testa exclusão de um chat."""
    response = client.delete(f'/chat/{test_chat.id}', headers=auth_headers)
    
    assert response.status_code == 200
    assert 'message' in response.json
    
    chat = Chat.query.get(test_chat.id)
    assert chat is None

def test_invalid_chat_id(client, auth_headers):
    """Testa acesso a chat inexistente."""
    response = client.get('/chat/99999/history', headers=auth_headers)
    assert response.status_code == 404

def test_unauthorized_access(client, test_chat):
    """Testa acesso não autorizado."""
    response = client.get(f'/chat/{test_chat.id}/history')
    assert response.status_code == 401

def test_message_validation(client, auth_headers, test_chat):
    """Testa validação de mensagem."""
    response = client.post(f'/chat/{test_chat.id}/message', json={
        'message': ''
    }, headers=auth_headers)
    assert response.status_code == 400
    
    long_message = 'x' * 1001
    response = client.post(f'/chat/{test_chat.id}/message', json={
        'message': long_message
    }, headers=auth_headers)
    assert response.status_code == 400
    
    response = client.post(f'/chat/{test_chat.id}/message', json={
        'message': '<script>alert("xss")</script>'
    }, headers=auth_headers)
    assert response.status_code == 400

def test_chat_pagination(client, auth_headers, test_chat):
    """Testa paginação do histórico de chat."""
    for i in range(15):
        message = Message(
            chat_id=test_chat.id,
            message=f'Message {i}',
            is_user=True,
            created_at=datetime.utcnow()
        )
        test_chat.messages.append(message)
    response = client.get(f'/chat/{test_chat.id}/history?page=1&per_page=10', headers=auth_headers)
    assert response.status_code == 200
    assert len(response.json['messages']) == 10
    response = client.get(f'/chat/{test_chat.id}/history?page=2&per_page=10', headers=auth_headers)
    assert response.status_code == 200
    assert len(response.json['messages']) == 5

def test_chat_search(client, auth_headers, test_chat):
    """Testa busca de mensagens no chat."""
    messages = [
        'Hello world',
        'Python programming',
        'Test message',
        'Hello Python'
    ]
    
    for msg in messages:
        message = Message(
            chat_id=test_chat.id,
            message=msg,
            is_user=True,
            created_at=datetime.utcnow()
        )
        test_chat.messages.append(message)
    
    response = client.get(f'/chat/{test_chat.id}/search?q=Hello', headers=auth_headers)
    assert response.status_code == 200
    assert len(response.json['messages']) == 2
    
    response = client.get(f'/chat/{test_chat.id}/search?q=Python', headers=auth_headers)
    assert response.status_code == 200
    assert len(response.json['messages']) == 2 