"""
Todo-Project 메인 애플리케이션
- 간결함 원칙: 애플리케이션 설정 및 라우터 등록만 담당
"""
from fastapi import FastAPI, Request, HTTPException
from fastapi.middleware.cors import CORSMiddleware
from fastapi.exceptions import RequestValidationError
from fastapi.responses import JSONResponse
import logging

from .core.config import settings
from .api.routes import auth, todos, calendar
from .core.database import AsyncSessionLocal
from .models.todo import Todo
from .models.user import User
from datetime import datetime, timedelta
from sqlalchemy import select

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

# FastAPI 앱 생성
app = FastAPI(
    title="Todo-Project API",
    description="간결한 Todo 관리 시스템 with 캘린더 연동",
    version="1.0.0",
    docs_url="/docs",
    redoc_url="/redoc"
)

# CORS 설정
app.add_middleware(
    CORSMiddleware,
    allow_origins=settings.ALLOWED_ORIGINS,
    allow_credentials=True,
    allow_methods=["*"],
    allow_headers=["*"],
)

# Validation 오류 핸들러
@app.exception_handler(RequestValidationError)
async def validation_exception_handler(request: Request, exc: RequestValidationError):
    logger.error(f"Validation 오류 - URL: {request.url}")
    logger.error(f"Validation 오류 상세: {exc.errors()}")
    return JSONResponse(
        status_code=422,
        content={
            "detail": "요청 데이터 검증 실패",
            "errors": exc.errors()
        }
    )

# 라우터 등록
app.include_router(auth.router, prefix="/api/auth", tags=["auth"])
app.include_router(todos.router, prefix="/api", tags=["todos"])
app.include_router(calendar.router, prefix="/api", tags=["calendar"])


@app.get("/")
async def root():
    """루트 엔드포인트"""
    return {
        "message": "Todo-Project API",
        "version": "1.0.0",
        "docs": "/docs"
    }


@app.get("/health")
async def health_check():
    """헬스 체크"""
    return {
        "status": "healthy",
        "service": "todo-project",
        "version": "1.0.0"
    }


async def create_sample_data():
    """샘플 데이터 생성 - 비활성화됨"""
    # 더미 데이터 생성 완전히 비활성화
    logger.info("샘플 데이터 생성이 비활성화되었습니다.")
    return


@app.on_event("startup")
async def startup_event():
    """애플리케이션 시작 시 초기화"""
    logger.info("🚀 Todo-Project API 시작")
    logger.info(f"📊 환경: {settings.ENVIRONMENT}")
    logger.info(f"🔗 데이터베이스: {settings.DATABASE_URL}")
    
    # 데이터베이스 초기화
    from .core.database import init_db
    await init_db()
    
    # 샘플 데이터 생성 비활성화
    logger.info("샘플 데이터 생성이 비활성화되었습니다.")


# 애플리케이션 종료 시 실행
@app.on_event("shutdown")
async def shutdown_event():
    """애플리케이션 종료 시 정리"""
    logger.info("🛑 Todo-Project API 종료")
    
    # 캘린더 서비스 연결 정리
    try:
        from .integrations.calendar import get_calendar_router
        calendar_router = get_calendar_router()
        await calendar_router.close_all()
        logger.info("📅 캘린더 서비스 연결 정리 완료")
    except Exception as e:
        logger.error(f"캘린더 서비스 정리 중 오류: {e}")


if __name__ == "__main__":
    import uvicorn
    uvicorn.run(
        "main:app",
        host="0.0.0.0",
        port=settings.PORT,
        reload=settings.DEBUG
    )
