/*
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License.  You may obtain a copy of the License at

 * http://www.apache.org/licenses/LICENSE-2.0

 * Unless required by applicable law or agreed to in writing,
 * software distributed under the License is distributed on an
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 * KIND, either express or implied.  See the License for the
 * specific language governing permissions and limitations
 * under the License.
 */

package org.apache.directory.scim.client;

import jakarta.ws.rs.client.Client;
import org.apache.directory.scim.client.rest.*;

/**
 * The root client used to access a SCIM server.
 *
 */
public class ScimClient {

  private final Client client;
  private final String baseUrl;

  private final RestCall restCall;

  public ScimClient(Client client, String baseUrl) {
    this(client, baseUrl, null);
  }

  public ScimClient(Client client, String baseUrl, RestCall restCall) {
    this.client = client;
    this.baseUrl = baseUrl;
    this.restCall = restCall;
  }

  public ScimUserClient userClient() {
    return new ScimUserClient(client, baseUrl, restCall);
  }

  public ScimGroupClient groupClient() {
    return new ScimGroupClient(client, baseUrl, restCall);
  }

  public ScimSelfClient selfClient() {
    return new ScimSelfClient(client, baseUrl, restCall);
  }

  public ResourceTypesClient resourceTypesClient() {
    return new ResourceTypesClient(client, baseUrl, restCall);
  }
}
