"""
Batch Dosage Recommendation API
"""

from fastapi import FastAPI
from fastapi.middleware.cors import CORSMiddleware
import sys
from pathlib import Path
from dotenv import load_dotenv

load_dotenv(Path(__file__).parent.parent.parent / ".env")

from src.utils.logger import get_logger

logger = get_logger(__name__)

# Add parent directories to path
sys.path.insert(0, str(Path(__file__).parent.parent.parent))

from src.database.connection import engine
from src.database.models import DDICache, DosageCache

from src.api.middleware.logging_middleware import RequestLoggingMiddleware
from src.api.routes.dosage import router as dosage_router
from src.api.routes.search import router as search_router

# Initialize FastAPI app
app = FastAPI(
    title="MyRX Dosage Recommendation API",
    version="1.0.0",
    description="Batch dosage recommendation API"
)

# Recreate DDICache table with normalized salt pair schema
try:
    DDICache.__table__.drop(bind=engine, checkfirst=True)
    DDICache.__table__.create(bind=engine, checkfirst=True)
    logger.info("DDICache table ready (normalized salt pairs)")
except Exception as e:
    logger.warning(f"DDICache table setup skipped: {e}")

# Ensure DosageCache table exists (preserves existing data)
try:
    DosageCache.__table__.create(bind=engine, checkfirst=True)
    # Add new columns if they don't exist (safe for existing tables)
    from sqlalchemy import text as _text
    with engine.connect() as _conn:
        for col, coltype in [('dose_morning', 'FLOAT DEFAULT 0'), ('dose_afternoon', 'FLOAT DEFAULT 0'), ('dose_night', 'FLOAT DEFAULT 0'), ('age_group_dosages', 'TEXT')]:
            try:
                _conn.execute(_text(f"ALTER TABLE dosage_cache ADD COLUMN {col} {coltype}"))
                _conn.commit()
            except Exception:
                pass  # Column already exists
    logger.info("DosageCache table ready (with meal-slot schedule columns)")
except Exception as e:
    logger.warning(f"DosageCache table setup skipped: {e}")

# Middleware (order matters — logging outermost so it wraps everything)
app.add_middleware(RequestLoggingMiddleware)
app.add_middleware(
    CORSMiddleware,
    allow_origins=["*"],
    allow_credentials=True,
    allow_methods=["*"],
    allow_headers=["*"],
)

# Register routers
app.include_router(dosage_router)
app.include_router(search_router)


@app.get("/")
async def root():
    """Health check"""
    return {
        "status": "operational",
        "version": "1.0.0",
        "api_type": "Dosage Recommendation",
        "compatible_with": "MyRX API format",
        "endpoints": [
            "/api/v1/drugs/dosage/prefetch",
            "/api/v1/drugs/dosage/recommendation",
            "/api/v1/drugs/dosage/health",
            "/api/v1/drugs/search?q=<query>",
        ],
    }


# Run the app
if __name__ == "__main__":
    import uvicorn
    uvicorn.run(app, host="0.0.0.0", port=8001)
