"""Easy Ads backend entrypoint.
Thin FastAPI app that wires together the route modules under /api,
registers startup hooks (Mongo indexes + admin seed) and CORS.
Helpers used by tests are re-exported from here for backwards compatibility.
"""
import logging
import os
import uuid
from datetime import datetime, timezone

from fastapi import FastAPI
from starlette.middleware.cors import CORSMiddleware

from core import (
    client, db, hash_password, init_storage, verify_password,
)
from routes import auth, campaigns, catalog, dashboard, media, meta, payments, profile, video

# Re-exports for /app/backend/tests/test_offislux.py
from routes.video import (  # noqa: F401
    _ai_video_storyboard,
    _html_brand,
    _html_cta,
    _html_overlay,
    _shotstack_url,
)

logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(name)s - %(levelname)s - %(message)s')
logger = logging.getLogger("easyads")

app = FastAPI(title="Easy Ads API")

for module in (auth, catalog, profile, media, campaigns, video, payments, meta, dashboard):
    app.include_router(module.router)

app.add_middleware(
    CORSMiddleware,
    allow_credentials=True,
    allow_origin_regex=".*",
    allow_methods=["*"],
    allow_headers=["*"],
)


@app.on_event("startup")
async def startup():
    await db.users.create_index("email", unique=True)
    await db.users.create_index("id", unique=True)
    await db.campaigns.create_index("user_id")
    await db.media.create_index("user_id")
    await db.profiles.create_index("user_id", unique=True)
    init_storage()
    admin_email = os.environ.get("ADMIN_EMAIL", "admin@offislux.com")
    admin_pw = os.environ.get("ADMIN_PASSWORD", "Admin@2026")
    existing = await db.users.find_one({"email": admin_email})
    if not existing:
        await db.users.insert_one({
            "id": str(uuid.uuid4()),
            "email": admin_email,
            "password_hash": hash_password(admin_pw),
            "name": "Easy Ads Admin",
            "role": "admin",
            "onboarding_complete": True,
            "created_at": datetime.now(timezone.utc).isoformat(),
        })
    elif not verify_password(admin_pw, existing["password_hash"]):
        await db.users.update_one({"email": admin_email}, {"$set": {"password_hash": hash_password(admin_pw)}})
    logger.info("Easy Ads backend started")


@app.on_event("shutdown")
async def shutdown():
    client.close()
