package dev.lions.user.manager.client.service;

import dev.lions.user.manager.dto.user.UserDTO;
import dev.lions.user.manager.dto.user.UserSearchCriteriaDTO;
import dev.lions.user.manager.dto.user.UserSearchResultDTO;
import jakarta.ws.rs.*;
import jakarta.ws.rs.core.MediaType;
import org.eclipse.microprofile.rest.client.inject.RegisterRestClient;

import java.util.List;

/**
 * REST Client pour le service de gestion des utilisateurs
 * Interface pour communiquer avec l'API backend
 */
@Path("/api/users")
@RegisterRestClient(configKey = "lions-user-manager-api")
@Produces(MediaType.APPLICATION_JSON)
@Consumes(MediaType.APPLICATION_JSON)
public interface UserServiceClient {

    /**
     * Rechercher des utilisateurs selon des critères
     */
    @POST
    @Path("/search")
    UserSearchResultDTO searchUsers(UserSearchCriteriaDTO criteria);

    /**
     * Récupérer un utilisateur par ID
     */
    @GET
    @Path("/{userId}")
    UserDTO getUserById(
        @PathParam("userId") String userId,
        @QueryParam("realm") String realmName
    );

    /**
     * Lister tous les utilisateurs (paginé)
     */
    @GET
    UserSearchResultDTO getAllUsers(
        @QueryParam("realm") String realmName,
        @QueryParam("page") @DefaultValue("0") int page,
        @QueryParam("pageSize") @DefaultValue("20") int pageSize
    );

    /**
     * Créer un nouvel utilisateur
     */
    @POST
    UserDTO createUser(
        UserDTO user,
        @QueryParam("realm") String realmName
    );

    /**
     * Mettre à jour un utilisateur
     */
    @PUT
    @Path("/{userId}")
    UserDTO updateUser(
        @PathParam("userId") String userId,
        UserDTO user,
        @QueryParam("realm") String realmName
    );

    /**
     * Supprimer un utilisateur
     */
    @DELETE
    @Path("/{userId}")
    void deleteUser(
        @PathParam("userId") String userId,
        @QueryParam("realm") String realmName
    );

    /**
     * Activer un utilisateur
     */
    @POST
    @Path("/{userId}/activate")
    void activateUser(
        @PathParam("userId") String userId,
        @QueryParam("realm") String realmName
    );

    /**
     * Désactiver un utilisateur
     */
    @POST
    @Path("/{userId}/deactivate")
    void deactivateUser(
        @PathParam("userId") String userId,
        @QueryParam("realm") String realmName
    );

    /**
     * Réinitialiser le mot de passe
     */
    @POST
    @Path("/{userId}/reset-password")
    void resetPassword(
        @PathParam("userId") String userId,
        @QueryParam("realm") String realmName,
        @QueryParam("newPassword") String newPassword
    );

    /**
     * Envoyer un email de vérification
     */
    @POST
    @Path("/{userId}/send-verification-email")
    void sendVerificationEmail(
        @PathParam("userId") String userId,
        @QueryParam("realm") String realmName
    );

    /**
     * Déconnecter toutes les sessions d'un utilisateur
     */
    @POST
    @Path("/{userId}/logout-sessions")
    void logoutAllSessions(
        @PathParam("userId") String userId,
        @QueryParam("realm") String realmName
    );

    /**
     * Récupérer les sessions actives d'un utilisateur
     */
    @GET
    @Path("/{userId}/sessions")
    List<String> getActiveSessions(
        @PathParam("userId") String userId,
        @QueryParam("realm") String realmName
    );
}

