"""5to sueño — FastAPI + Socket.IO entry point."""
import os
import logging
from pathlib import Path
from datetime import datetime, timezone

from dotenv import load_dotenv

ROOT_DIR = Path(__file__).parent
load_dotenv(ROOT_DIR / ".env")

from fastapi import FastAPI, APIRouter
from starlette.middleware.cors import CORSMiddleware
import socketio

from auth import hash_password, verify_password
from deps import get_db, get_client
from socket_server import sio
from routes_auth import router as auth_router
from routes_activation import router as activation_router
from routes_users import router as users_router
from routes_departments import router as departments_router
from routes_projects import router as projects_router
from routes_tasks import router as tasks_router
from routes_cms import router as cms_router
from routes_chat import router as chat_router
from routes_contact import router as contact_router
from routes_crm import router as crm_router
from routes_marketing import router as marketing_router
from routes_notifications import router as notifications_router
from routes_search import router as search_router
from routes_proposals import router as proposals_router

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


fastapi_app = FastAPI(title="5to sueño API", version="2.0.0")

api_router = APIRouter(prefix="/api")


@api_router.get("/")
async def root():
    return {"name": "5to sueño API", "status": "ok", "version": "2.0.0"}


@api_router.get("/health")
async def health():
    return {"status": "healthy", "ts": datetime.now(timezone.utc).isoformat()}


for r in [
    auth_router, activation_router, users_router, departments_router,
    projects_router, tasks_router, cms_router, chat_router, contact_router,
    crm_router, marketing_router, notifications_router, search_router, proposals_router,
]:
    api_router.include_router(r)

fastapi_app.include_router(api_router)

origins_env = os.environ.get("CORS_ORIGINS", "")
origins = [o.strip() for o in origins_env.split(",") if o.strip()] or ["http://localhost:3000"]

fastapi_app.add_middleware(
    CORSMiddleware,
    allow_origins=origins,
    allow_credentials=True,
    allow_methods=["*"],
    allow_headers=["*"],
)


@fastapi_app.on_event("startup")
async def on_startup():
    db = get_db()
    # indexes
    await db.users.create_index("email", unique=True)
    await db.users.create_index("activation_token")
    await db.channels.create_index([("type", 1), ("members", 1)])
    await db.messages.create_index([("channel_id", 1), ("created_at", 1)])
    await db.tasks.create_index([("project_id", 1), ("status", 1)])
    await db.notifications.create_index([("user_id", 1), ("created_at", -1)])
    await db.notifications.create_index([("user_id", 1), ("read", 1)])
    await db.crm_clients.create_index("status")
    await db.crm_clients.create_index("email")
    await db.email_log.create_index([("created_at", -1)])
    await db.departments.create_index("name", unique=True)

    now_iso = datetime.now(timezone.utc).isoformat()

    # admin / CEO / RH / demo seeding (active by default; force change on first login=False for these)
    seed_accounts = [
        {"email": os.environ.get("ADMIN_EMAIL", "admin@5tosueno.com").lower(),
         "password": os.environ.get("ADMIN_PASSWORD", "Admin5to2026!"),
         "name": os.environ.get("ADMIN_NAME", "Administrador"), "role": "admin"},
        {"email": "ceo@5tosueno.com", "password": "Ceo5to2026!", "name": "Renata Cárdenas", "role": "ceo"},
        {"email": "rh@5tosueno.com", "password": "Rh5to2026!", "name": "Pablo Soto", "role": "rh"},
        {"email": "pm@5tosueno.com", "password": "Pm5to2026!", "name": "Laura Méndez", "role": "pm"},
        {"email": "pmo@5tosueno.com", "password": "Pmo5to2026!", "name": "Ricardo Téllez", "role": "pmo"},
        {"email": "sales@5tosueno.com", "password": "Sales5to2026!", "name": "Diana Rojas", "role": "sales"},
        {"email": "marketing@5tosueno.com", "password": "Mkt5to2026!", "name": "Esteban Núñez", "role": "marketing"},
        {"email": "account@5tosueno.com", "password": "Acc5to2026!", "name": "Mariana López", "role": "account_manager"},
        {"email": "dev@5tosueno.com", "password": "Dev5to2026!", "name": "Carlos Ríos", "role": "collaborator"},
        {"email": "cliente@empresa.com", "password": "Cliente5to2026!", "name": "Sofía Vargas", "role": "client"},
    ]
    for d in seed_accounts:
        existing = await db.users.find_one({"email": d["email"]})
        if not existing:
            await db.users.insert_one({
                "email": d["email"],
                "password_hash": hash_password(d["password"]),
                "name": d["name"],
                "role": d["role"],
                "avatar_url": None,
                "active": True,
                "must_change_password": False,
                "created_at": now_iso,
            })
        else:
            # ensure existing seeded accounts have active flag (preserve password)
            updates = {}
            if "active" not in existing:
                updates["active"] = True
            if "must_change_password" not in existing:
                updates["must_change_password"] = False
            if updates:
                await db.users.update_one({"_id": existing["_id"]}, {"$set": updates})

    # seed departments (idempotent)
    if await db.departments.count_documents({}) == 0:
        depts = [
            {"name": "Dirección", "description": "CEO y dirección general", "color": "#FF4D4D"},
            {"name": "Ingeniería", "description": "Desarrollo web y móvil", "color": "#00E599"},
            {"name": "Diseño", "description": "UI/UX y branding", "color": "#007AFF"},
            {"name": "PMO", "description": "Gestión de proyectos", "color": "#FFB020"},
            {"name": "Ventas", "description": "Ventas y nuevos negocios", "color": "#A78BFA"},
            {"name": "Marketing", "description": "Marketing y campañas", "color": "#F472B6"},
            {"name": "Recursos Humanos", "description": "Talento y cultura", "color": "#34D399"},
        ]
        for d in depts:
            d["created_at"] = now_iso
        result = await db.departments.insert_many(depts)
        for dept_id, dept in zip(result.inserted_ids, depts):
            await db.channels.insert_one({
                "name": f"Depto: {dept['name']}",
                "type": "department",
                "department_id": str(dept_id),
                "project_id": None,
                "members": [],
                "created_at": now_iso,
            })

    # seed CMS content (idempotent — only if empty)
    if await db.services.count_documents({}) == 0:
        await db.services.insert_many([
            {"title": "Desarrollo Web", "description": "Aplicaciones web modernas, rápidas y escalables con React, Next.js y arquitecturas cloud-native.", "icon": "Code2", "order": 0, "created_at": now_iso},
            {"title": "Apps Móviles", "description": "iOS y Android nativas o cross-platform. Diseño UX impecable y rendimiento de primer nivel.", "icon": "Smartphone", "order": 1, "created_at": now_iso},
            {"title": "UI/UX Design", "description": "Investigación, prototipado y diseño de interfaces que enamoran y convierten.", "icon": "Palette", "order": 2, "created_at": now_iso},
            {"title": "Consultoría Tecnológica", "description": "Auditorías, arquitectura de sistemas y estrategia digital para escalar tu negocio.", "icon": "BrainCircuit", "order": 3, "created_at": now_iso},
        ])
    if await db.testimonials.count_documents({}) == 0:
        await db.testimonials.insert_many([
            {"name": "María Fernández", "role": "CEO", "company": "Lumen Studios", "quote": "El equipo de 5to sueño elevó nuestra plataforma a otro nivel. Velocidad, calidad y comunicación impecable.", "avatar_url": None, "order": 0, "created_at": now_iso},
            {"name": "Daniel Cruz", "role": "Founder", "company": "Nimbus App", "quote": "Entregaron una app móvil pulida en tiempo récord. Cada hito quedó documentado y aprobado a tiempo.", "avatar_url": None, "order": 1, "created_at": now_iso},
            {"name": "Andrea Salas", "role": "CTO", "company": "Helio Health", "quote": "Su consultoría reorganizó nuestra arquitectura. Hoy iteramos 3x más rápido.", "avatar_url": None, "order": 2, "created_at": now_iso},
        ])
    if await db.portfolio.count_documents({}) == 0:
        await db.portfolio.insert_many([
            {"title": "Lumen Analytics", "category": "Web App", "description": "Dashboard de analítica B2B con visualizaciones en tiempo real.", "image_url": "https://static.prod-images.emergentagent.com/jobs/14dd1992-09b1-49de-a802-9219402d0834/images/78209989a7ca6e4ab6f23a68a63010959c0cad76d13df5ecd8e260cbf8c20c22.png", "link": None, "order": 0, "created_at": now_iso},
            {"title": "Nimbus Mobile", "category": "Mobile", "description": "App móvil iOS/Android para gestión financiera personal.", "image_url": "https://static.prod-images.emergentagent.com/jobs/14dd1992-09b1-49de-a802-9219402d0834/images/fcf5041ec937bcd777a53e04358af2cdb9cb940a04f4c56b8687a4132fe179e3.png", "link": None, "order": 1, "created_at": now_iso},
        ])

    # seed default email template
    if await db.email_templates.count_documents({}) == 0:
        await db.email_templates.insert_one({
            "name": "Bienvenida cliente",
            "subject": "Hola {{name}}, gracias por contactarnos",
            "body_html": "<p>Hola {{name}},</p><p>Gracias por tu interés en 5to sueño. Pronto un miembro de nuestro equipo de ventas se pondrá en contacto contigo desde {{company}}.</p><p>Un saludo,<br/>Equipo 5to sueño</p>",
            "description": "Plantilla de bienvenida automatizada",
            "created_at": now_iso,
        })

    logger.info("Startup complete.")


@fastapi_app.on_event("shutdown")
async def on_shutdown():
    client = get_client()
    client.close()


app = socketio.ASGIApp(sio, other_asgi_app=fastapi_app, socketio_path="/api/socket.io")
