"""Rutas para gestión de invitaciones de usuarios."""

import logging

from core.database import get_core_db
from core.security import get_current_user, validate_access_to_resource
from fastapi import APIRouter, Depends, Request
from fastapi.security import HTTPBearer
from sqlalchemy.orm import Session

from .dto import CreateInviteDTO, InviteResponseDTO
from .service import InviteService

router = APIRouter(prefix="/invites", tags=["Invites"])
_bearer = HTTPBearer()

logger = logging.getLogger(__name__)


@router.post("", response_model=InviteResponseDTO, status_code=201)
async def create_invite(
    data: CreateInviteDTO,
    request: Request,
    db: Session = Depends(get_core_db),
    current_user: dict = Depends(get_current_user),
    credentials=Depends(_bearer),
):
    """
    Genera un token de invitación para que un usuario externo se registre.
    Requiere permiso user.create. Usa el token del usuario actual para crear
    el invite en el Hub — no requiere credenciales de hub_admin.
    """
    validate_access_to_resource(
        db,
        data.company_id,
        current_user,
        required_permissions=["user.create"],
    )

    # tenant_slug: del token si viene; si el usuario es hub_admin (sin tenant en el
    # token), se resuelve desde la compañía destino (a76.company → core.tenants).
    tenant_slug: str = current_user.get("tenant_slug") or ""
    if not tenant_slug:
        from sqlalchemy import text as _text
        row = db.execute(
            _text(
                "SELECT t.slug FROM a76.company c "
                "JOIN core.tenants t ON t.id = c.tenant_id WHERE c.id = :c"
            ),
            {"c": data.company_id},
        ).first()
        if row and row[0]:
            tenant_slug = row[0]

    created_by: str = current_user.get("sub") or ""

    # El invite se crea en el Hub: se necesita el token KC (la sesión local no la
    # acepta el Hub). Se toma de la sesión (valkey) y se refresca si hace falta.
    from core.hub_token import get_hub_access_token

    kc_token = await get_hub_access_token(request)

    service = InviteService(db)
    return await service.create_invite(
        data=data,
        created_by=created_by,
        tenant_slug=tenant_slug,
        user_access_token=kc_token or credentials.credentials,
    )
