"""
pytest 설정 및 공통 픽스처
"""
import pytest
import asyncio
from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker
from fastapi.testclient import TestClient
import tempfile
import os

from app.main import app
from app.database import get_db
from app.models import Base


# 테스트용 데이터베이스 설정
TEST_DATABASE_URL = "sqlite:///./test.db"

engine = create_engine(
    TEST_DATABASE_URL,
    connect_args={"check_same_thread": False}
)
TestingSessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine)


def override_get_db():
    """테스트용 데이터베이스 세션"""
    try:
        db = TestingSessionLocal()
        yield db
    finally:
        db.close()


@pytest.fixture(scope="session")
def event_loop():
    """이벤트 루프 픽스처"""
    loop = asyncio.get_event_loop_policy().new_event_loop()
    yield loop
    loop.close()


@pytest.fixture(scope="function")
def db_session():
    """테스트용 데이터베이스 세션 픽스처"""
    # 테이블 생성
    Base.metadata.create_all(bind=engine)
    
    # 세션 생성
    session = TestingSessionLocal()
    
    try:
        yield session
    finally:
        session.close()
        # 테이블 삭제 (테스트 격리)
        Base.metadata.drop_all(bind=engine)


@pytest.fixture(scope="function")
def client(db_session):
    """테스트 클라이언트 픽스처"""
    # 데이터베이스 의존성 오버라이드
    app.dependency_overrides[get_db] = override_get_db
    
    with TestClient(app) as test_client:
        yield test_client
    
    # 의존성 오버라이드 정리
    app.dependency_overrides.clear()


@pytest.fixture
def sample_excel_file():
    """샘플 엑셀 파일 픽스처"""
    import pandas as pd
    
    # 샘플 데이터 생성
    data = {
        'Description': [
            'PIPE, SEAMLESS, A333-6, 6", SCH40',
            'ELBOW, 90DEG, A234-WPB, 4", SCH40',
            'VALVE, GATE, A216-WCB, 2", 150LB',
            'FLANGE, WELD NECK, A105, 3", 150LB',
            'BOLT, HEX HEAD, A193-B7, M16X50'
        ],
        'Quantity': [10, 8, 2, 4, 20],
        'Unit': ['EA', 'EA', 'EA', 'EA', 'EA']
    }
    
    df = pd.DataFrame(data)
    
    # 임시 파일 생성
    with tempfile.NamedTemporaryFile(suffix='.xlsx', delete=False) as tmp_file:
        df.to_excel(tmp_file.name, index=False)
        yield tmp_file.name
    
    # 파일 정리
    os.unlink(tmp_file.name)


@pytest.fixture
def sample_csv_file():
    """샘플 CSV 파일 픽스처"""
    import pandas as pd
    
    # 샘플 데이터 생성
    data = {
        'Description': [
            'PIPE, SEAMLESS, A333-6, 8", SCH40',
            'TEE, EQUAL, A234-WPB, 6", SCH40',
            'VALVE, BALL, A216-WCB, 4", 150LB'
        ],
        'Quantity': [5, 3, 1],
        'Unit': ['EA', 'EA', 'EA']
    }
    
    df = pd.DataFrame(data)
    
    # 임시 파일 생성
    with tempfile.NamedTemporaryFile(suffix='.csv', delete=False, mode='w') as tmp_file:
        df.to_csv(tmp_file.name, index=False)
        yield tmp_file.name
    
    # 파일 정리
    os.unlink(tmp_file.name)


@pytest.fixture
def sample_job_data():
    """샘플 작업 데이터 픽스처"""
    return {
        "job_no": "TEST-2025-001",
        "job_name": "테스트 프로젝트",
        "client_name": "테스트 고객사",
        "end_user": "테스트 사용자",
        "epc_company": "테스트 EPC",
        "status": "active"
    }


@pytest.fixture
def sample_material_data():
    """샘플 자재 데이터 픽스처"""
    return {
        "original_description": "PIPE, SEAMLESS, A333-6, 6\", SCH40",
        "classified_category": "PIPE",
        "classified_subcategory": "SEAMLESS",
        "material_grade": "A333-6",
        "schedule": "SCH40",
        "size_spec": "6\"",
        "quantity": 10.0,
        "unit": "EA",
        "classification_confidence": 0.95
    }


# 테스트 설정
pytest_plugins = []
