/**
 * @ Author: Harry
 * @ Create Time: 2025-06-26
 * @ Modified by: Harry
 * @ Modified time: 2025-06-26
 * @ Description: Service class for Kinde integration.
 */

package ca.trolet.datareplicationservice.services;

import ca.trolet.datareplicationservice.payloads.dtos.KindeUserDto;
import lombok.RequiredArgsConstructor;
import org.openapitools.client.ApiException;
import org.openapitools.client.api.UsersApi;
import org.openapitools.client.model.UsersResponse;
import org.openapitools.client.model.UsersResponseUsersInner;
import org.openapitools.client.model.User;
import org.springframework.stereotype.Service;

import java.util.List;

@Service
@RequiredArgsConstructor
public class KindeService {

    private final UsersApi usersApi;

    public List<UsersResponseUsersInner> getAllUsers() {
        try {
            UsersResponse response = usersApi.getUsers(
                    null,  // pageSize
                    null,  // userId
                    null,  // nextToken
                    null,  // email
                    null,  // username
                    null,  // expand
                    null   // hasOrganization
            );
            return response.getUsers();
        } catch (ApiException e) {
            throw new RuntimeException("Error retrieving Kinde users: " + e.getMessage(), e);
        }
    }

    // Use this if there are many users and you need to paginate through them
    public List<UsersResponseUsersInner> getUsersWithPagination(Integer pageSize, String nextToken) {
        try {
            UsersResponse response = usersApi.getUsers(
                    pageSize,  // pageSize
                    null,      // userId
                    nextToken, // nextToken
                    null,      // email
                    null,      // username
                    null,      // expand
                    null       // hasOrganization
            );
            return response.getUsers();
        } catch (ApiException e) {
            throw new RuntimeException("Error retrieving Kinde users: " + e.getMessage(), e);
        }
    }

    public User getUserById(String userId) {
        try {
            return usersApi.getUserData(userId, null);
        } catch (ApiException e) {
            throw new RuntimeException("Error while retrieving user by ID: " + e.getMessage(), e);
        }
    }
}
