# -*- coding: utf-8 -*-
"""
Nom du fichier : users.py
Chemin : /gitlab-bridge/app/api/v1/users.py
Description : Endpoint de recherche d'utilisateurs GitLab compatibles OpenWebUI.
Options éventuelles :
    - POST /api/v1/users/search
Auteur : Sylvain SCATTOLINI
Date de création / modification : 2026-05-21
Version : 1.0
"""

from __future__ import annotations

import logging

from fastapi import APIRouter, HTTPException, status

from app.clients.gitlab_client import GitLabClient
from app.core.exceptions import GitLabApiError
from app.schemas.users import UserItem, UserSearchRequest, UserSearchResponse
from app.utils.helpers import compute_similarity_score

router = APIRouter(prefix="/api/v1/users", tags=["users"])

logger = logging.getLogger(__name__)


@router.post(
    "/search",
    operation_id="search_users",
    summary="Rechercher des utilisateurs GitLab",
    description="Recherche des utilisateurs GitLab par nom, prénom ou username avec scoring de pertinence.",
    response_model=UserSearchResponse,
)
def search_users(payload: UserSearchRequest) -> UserSearchResponse:
    try:
        client = GitLabClient()
        query = payload.query.strip()

        try:
            raw_users = client.search_users(username=query)
        except GitLabApiError as exc:
            raise HTTPException(status_code=502, detail=str(exc)) from exc

        scored: list[tuple[int, dict]] = []
        for user in raw_users:
            if not isinstance(user, dict):
                continue
            username = str(user.get("username", ""))
            name = str(user.get("name", ""))
            score = max(
                compute_similarity_score(query, username),
                compute_similarity_score(query, name),
            )
            if score >= 40:
                scored.append((score, user))

        scored.sort(key=lambda t: -t[0])

        users = [
            UserItem(
                id=int(u["id"]),
                username=str(u.get("username", "")),
                name=str(u.get("name", "")),
                state=str(u.get("state", "active")),
                avatar_url=u.get("avatar_url"),
            )
            for _, u in scored[: payload.limit]
        ]

        return UserSearchResponse(success=True, query=query, users=users)

    except HTTPException:
        raise
    except Exception as exc:
        logger.exception("Erreur inattendue dans search_users : %s", str(exc))
        raise HTTPException(
            status_code=status.HTTP_500_INTERNAL_SERVER_ERROR,
            detail="Erreur interne lors de la recherche d'utilisateurs.",
        ) from exc
