/*
 *  Copyright 2018 The WebRTC project authors. All Rights Reserved.
 *
 *  Use of this source code is governed by a BSD-style license
 *  that can be found in the LICENSE file in the root of the source
 *  tree. An additional intellectual property rights grant can be found
 *  in the file PATENTS.  All contributing project authors may
 *  be found in the AUTHORS file in the root of the source tree.
 */

package org.webrtc;

import android.support.annotation.Nullable;

/**
 * PeerConnectionDependencies holds all PeerConnection dependencies that are
 * applied per PeerConnection. A dependency is distinct from a configuration
 * as it defines significant executable code that can be provided by a user of
 * the API.
 */
public final class PeerConnectionDependencies {
  // Mandatory dependencies.
  private final PeerConnection.Observer observer;

  // Optional fields.
  private final SSLCertificateVerifier sslCertificateVerifier;

  public static class Builder {
    private PeerConnection.Observer observer;
    private SSLCertificateVerifier sslCertificateVerifier;

    private Builder(PeerConnection.Observer observer) {
      this.observer = observer;
    }

    public Builder setSSLCertificateVerifier(SSLCertificateVerifier sslCertificateVerifier) {
      this.sslCertificateVerifier = sslCertificateVerifier;
      return this;
    }

    // Observer is a required dependency and so is forced in the construction of the object.
    public PeerConnectionDependencies createPeerConnectionDependencies() {
      return new PeerConnectionDependencies(observer, sslCertificateVerifier);
    }
  }

  public static Builder builder(PeerConnection.Observer observer) {
    return new Builder(observer);
  }

  PeerConnection.Observer getObserver() {
    return observer;
  }

  @Nullable
  SSLCertificateVerifier getSSLCertificateVerifier() {
    return sslCertificateVerifier;
  }

  private PeerConnectionDependencies(
      PeerConnection.Observer observer, SSLCertificateVerifier sslCertificateVerifier) {
    this.observer = observer;
    this.sslCertificateVerifier = sslCertificateVerifier;
  }
}
