/*
 *  Copyright 2013 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 androidx.annotation.Nullable;
import java.util.Arrays;
import org.webrtc.PeerConnection;

/**
 * Representation of a single ICE Candidate, mirroring
 * {@code IceCandidate} in the C++ API.
 */
public class IceCandidate {
  public final String sdpMid;
  public final int sdpMLineIndex;
  public final String sdp;
  public final String serverUrl;
  public final PeerConnection.AdapterType adapterType;

  public IceCandidate(String sdpMid, int sdpMLineIndex, String sdp) {
    this.sdpMid = sdpMid;
    this.sdpMLineIndex = sdpMLineIndex;
    this.sdp = sdp;
    this.serverUrl = "";
    this.adapterType = PeerConnection.AdapterType.UNKNOWN;
  }

  @CalledByNative
  IceCandidate(String sdpMid, int sdpMLineIndex, String sdp, String serverUrl,
      PeerConnection.AdapterType adapterType) {
    this.sdpMid = sdpMid;
    this.sdpMLineIndex = sdpMLineIndex;
    this.sdp = sdp;
    this.serverUrl = serverUrl;
    this.adapterType = adapterType;
  }

  @Override
  public String toString() {
    return sdpMid + ":" + sdpMLineIndex + ":" + sdp + ":" + serverUrl + ":"
        + adapterType.toString();
  }

  @CalledByNative
  String getSdpMid() {
    return sdpMid;
  }

  @CalledByNative
  String getSdp() {
    return sdp;
  }

  @CalledByNative
  int getSdpMLineIndex() {
    return sdpMLineIndex;
  }

  /** equals() checks sdpMid, sdpMLineIndex, and sdp for equality. */
  @Override
  public boolean equals(@Nullable Object object) {
    if (!(object instanceof IceCandidate)) {
      return false;
    }

    IceCandidate that = (IceCandidate) object;
    return objectEquals(this.sdpMid, that.sdpMid) && this.sdpMLineIndex == that.sdpMLineIndex
        && objectEquals(this.sdp, that.sdp);
  }

  @Override
  public int hashCode() {
    Object[] values = {sdpMid, sdpMLineIndex, sdp};
    return Arrays.hashCode(values);
  }

  private static boolean objectEquals(Object o1, Object o2) {
    if (o1 == null) {
      return o2 == null;
    }
    return o1.equals(o2);
  }
}
