"""Configuração e fixtures para testes."""

import pytest
from src import create_app
from src.models import db, User, Agente, Chat, Message
from src.security import init_security
from datetime import datetime

@pytest.fixture
def app():
    """Fixture que cria uma instância da aplicação para testes."""
    app = create_app('test')
    app.config.update({
        'TESTING': True,
        'SQLALCHEMY_DATABASE_URI': 'sqlite:///:memory:',
        'SQLALCHEMY_TRACK_MODIFICATIONS': False,
        'SECRET_KEY': 'test-key',
        'WTF_CSRF_ENABLED': False,
        'JWT_SECRET_KEY': 'test-jwt-key'
    })
    
    with app.app_context():
        init_security(app)
        yield app
        db.session.remove()
        db.drop_all()

@pytest.fixture
def client(app):
    """Fixture que cria um cliente de teste."""
    return app.test_client()

@pytest.fixture
def runner(app):
    """Fixture que cria um runner de CLI para testes."""
    return app.test_cli_runner()

@pytest.fixture
def test_user(app):
    """Fixture que cria um usuário de teste."""
    user = User(username='testuser')
    user.set_password('testpass123!')
    db.session.add(user)
    db.session.commit()
    return user

@pytest.fixture
def test_agent(app, test_user):
    """Fixture que cria um agente de teste."""
    agent = Agente(
        nome='Test Agent',
        descricao='Test Description',
        user_id=test_user.id
    )
    db.session.add(agent)
    db.session.commit()
    return agent

@pytest.fixture
def test_chat(app, test_user, test_agent):
    """Fixture que cria um chat de teste."""
    chat = Chat(
        user_id=test_user.id,
        agent_id=test_agent.id,
        created_at=datetime.utcnow()
    )
    db.session.add(chat)
    db.session.commit()
    return chat

@pytest.fixture
def test_message(app, test_chat):
    """Fixture que cria uma mensagem de teste."""
    message = Message(
        chat_id=test_chat.id,
        message='Test message',
        is_user=True,
        created_at=datetime.utcnow()
    )
    db.session.add(message)
    db.session.commit()
    return message

@pytest.fixture
def auth_headers(test_user, client):
    """Fixture que retorna headers de autenticação."""
    response = client.post('/login', json={
        'username': 'testuser',
        'password': 'testpass123!'
    })
    token = response.json['data']['access_token']
    return {'Authorization': f'Bearer {token}'} 