package dev.lions.user.manager.mapper;

import dev.lions.user.manager.dto.role.RoleDTO;
import dev.lions.user.manager.enums.role.TypeRole;
import org.keycloak.representations.idm.RoleRepresentation;

import java.util.List;
import java.util.stream.Collectors;

/**
 * Mapper pour convertir entre RoleDTO et Keycloak RoleRepresentation
 */
public class RoleMapper {

    /**
     * Convertit une RoleRepresentation Keycloak en RoleDTO
     */
    public static RoleDTO toDTO(RoleRepresentation roleRep, String realmName, TypeRole typeRole) {
        if (roleRep == null) {
            return null;
        }

        return RoleDTO.builder()
            .id(roleRep.getId())
            .name(roleRep.getName())
            .description(roleRep.getDescription())
            .typeRole(typeRole)
            .realmName(realmName)
            .composite(roleRep.isComposite())
            .build();
    }

    /**
     * Convertit un RoleDTO en RoleRepresentation Keycloak
     */
    public static RoleRepresentation toRepresentation(RoleDTO roleDTO) {
        if (roleDTO == null) {
            return null;
        }

        RoleRepresentation roleRep = new RoleRepresentation();
        roleRep.setId(roleDTO.getId());
        roleRep.setName(roleDTO.getName());
        roleRep.setDescription(roleDTO.getDescription());
        roleRep.setComposite(roleDTO.isComposite());
        roleRep.setClientRole(roleDTO.getTypeRole() == TypeRole.CLIENT_ROLE);

        return roleRep;
    }

    /**
     * Convertit une liste de RoleRepresentation en liste de RoleDTO
     */
    public static List<RoleDTO> toDTOList(List<RoleRepresentation> roleReps, String realmName, TypeRole typeRole) {
        if (roleReps == null) {
            return List.of();
        }

        return roleReps.stream()
            .map(roleRep -> toDTO(roleRep, realmName, typeRole))
            .collect(Collectors.toList());
    }

    /**
     * Convertit une liste de RoleDTO en liste de RoleRepresentation
     */
    public static List<RoleRepresentation> toRepresentationList(List<RoleDTO> roleDTOs) {
        if (roleDTOs == null) {
            return List.of();
        }

        return roleDTOs.stream()
            .map(RoleMapper::toRepresentation)
            .collect(Collectors.toList());
    }
}
