import asyncio
import logging
from pathlib import Path

from src.utils.config import load_config, get_database_url
from src.db.rag_minutes_db import RagMinutesDB
from src.db.postgres_vector import PostgresVectorDB
from src.utils.embedding import EmbeddingGenerator
from src.services.eventhub_consumer import start_consumer

# 로깅 설정
logging.basicConfig(
    level=logging.INFO,
    format='%(asctime)s - %(name)s - %(levelname)s - %(message)s'
)
logger = logging.getLogger(__name__)


async def main():
    """메인 함수"""
    try:
        # 설정 로드
        config_path = Path(__file__).parent / "config.yaml"
        config = load_config(str(config_path))
        logger.info(config)

        logger.info("설정 로드 완료")

        # 데이터베이스 연결
        db_url = get_database_url(config)
        rag_minutes_db = RagMinutesDB(db_url)
        logger.info("RAG Minutes DB 연결 완료")

        # 용어집 데이터베이스 연결
        term_db = PostgresVectorDB(db_url)
        logger.info("용어집 DB 연결 완료")

        # Embedding 생성기 초기화
        azure_openai = config["azure_openai"]
        embedding_gen = EmbeddingGenerator(
            api_key=azure_openai["api_key"],
            endpoint=azure_openai["endpoint"],
            model=azure_openai["embedding_model"],
            dimension=azure_openai["embedding_dimension"],
            api_version=azure_openai["api_version"]
        )

        logger.info("Embedding 생성기 초기화 완료")

        # Event Hub Consumer 시작
        logger.info("Event Hub Consumer 시작...")
        await start_consumer(config, rag_minutes_db, embedding_gen, term_db)

    except KeyboardInterrupt:
        logger.info("프로그램 종료")
    except Exception as e:
        logger.error(f"에러 발생: {str(e)}")
        raise


if __name__ == "__main__":
    asyncio.run(main())
