"""
Pytest配置和共享fixtures
"""
import pytest
from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker
from fastapi.testclient import TestClient
from app.core.database import Base, get_db, SessionLocal
from app.main import app
from app.core.config import settings
import os

# 测试数据库URL（使用SQLite内存数据库）
TEST_DATABASE_URL = "sqlite:///:memory:"

# 创建测试数据库引擎
test_engine = create_engine(
    TEST_DATABASE_URL,
    connect_args={"check_same_thread": False}
)

# 创建测试会话工厂
TestingSessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=test_engine)


@pytest.fixture(scope="function")
def db_session():
    """创建测试数据库会话"""
    # 创建所有表
    Base.metadata.create_all(bind=test_engine)
    
    # 创建会话
    session = TestingSessionLocal()
    try:
        yield session
    finally:
        session.close()
        # 删除所有表
        Base.metadata.drop_all(bind=test_engine)


@pytest.fixture(scope="function")
def client(db_session):
    """创建测试客户端"""
    def override_get_db():
        try:
            yield db_session
        finally:
            pass
    
    app.dependency_overrides[get_db] = override_get_db
    
    with TestClient(app) as test_client:
        yield test_client
    
    app.dependency_overrides.clear()


@pytest.fixture
def test_user_data():
    """测试用户数据"""
    return {
        "username": "testuser",
        "email": "test@example.com",
        "password": "testpassword123"
    }


@pytest.fixture
def authenticated_client(client, test_user_data):
    """创建已认证的测试客户端"""
    # 注册用户
    response = client.post("/api/v1/auth/register", json=test_user_data)
    assert response.status_code == 201
    
    # 登录获取token
    login_response = client.post(
        "/api/v1/auth/login",
        data={
            "username": test_user_data["username"],
            "password": test_user_data["password"]
        }
    )
    assert login_response.status_code == 200
    token = login_response.json()["access_token"]
    
    # 设置认证头
    client.headers.update({"Authorization": f"Bearer {token}"})
    
    return client


@pytest.fixture
def sample_workflow_data():
    """示例工作流数据"""
    return {
        "name": "测试工作流",
        "description": "这是一个测试工作流",
        "nodes": [
            {
                "id": "start-1",
                "type": "start",
                "position": {"x": 0, "y": 0},
                "data": {"label": "开始"}
            },
            {
                "id": "llm-1",
                "type": "llm",
                "position": {"x": 200, "y": 0},
                "data": {
                    "label": "LLM节点",
                    "provider": "deepseek",
                    "prompt": "请回答：{input}",
                    "model": "deepseek-chat"
                }
            },
            {
                "id": "end-1",
                "type": "end",
                "position": {"x": 400, "y": 0},
                "data": {"label": "结束"}
            }
        ],
        "edges": [
            {
                "id": "e1",
                "source": "start-1",
                "target": "llm-1"
            },
            {
                "id": "e2",
                "source": "llm-1",
                "target": "end-1"
            }
        ]
    }
