import type { MediaTrackConstraints } from 'react-native-webrtc/lib/typescript/Constraints';
import { MediaStream } from 'react-native-webrtc';

export interface CallOptions {
  /**
   * The destination for the call.
   * This can be a phone number, SIP URI, or any other valid Telnyx destination.
   */
  destinationNumber?: string;

  /**
   * WebRTC audio constraints for the call.
   * This can be a boolean to enable/disable audio or an object with specific constraints.
   * @default true
   * @see https://developer.mozilla.org/en-US/docs/Web/API/MediaTrackConstraints
   * @example
   * ```typescript
   * {
   *   audio: {
   *     echoCancellation: true,
   *     noiseSuppression: true,
   *     autoGainControl: true,
   *   },
   * }
   * ```
   * @example
   * ```typescript
   * {
   *   audio: true, // Enable audio with default constraints
   * }
   * ```
   */
  audio?: boolean | MediaTrackConstraints;
  /**
   * The caller ID name to display for the call.
   */
  callerIdName?: string;
  /**
   * The caller ID number to display for the call.
   */
  callerIdNumber?: string;
  /**
   * Custom headers to include in the call request.
   * This can be used to pass additional information or metadata with the call.
   * Each header should be an object with `name` and `value` properties.
   * @example
   * ```typescript
   * [
   *   { name: 'X-Custom-Header', value: 'CustomValue' },
   *   { name: 'X-Another-Header', value: 'AnotherValue' },
   * ]
   * ```
   */
  customHeaders?: { name: string; value: string }[];
  /**
   * Client state to persist across calls.
   * This can be used to store any custom state information that should be maintained.
   * This is typically specified as base64 encoded string.
   * @example
   * ```typescript
   * btoa(JSON.stringify({ key: 'value' }))
   * ```
   * @see https://developer.mozilla.org/en-US/docs/Web/API/WindowOrWorkerGlobalScope/btoa
   * @see https://developer.mozilla.org/en-US/docs/Web/API/WindowOrWorkerGlobalScope/atob
   *
   */
  clientState?: string;
  /**
   * optional MediaStream for the local audio  tracks.
   */
  localStream?: MediaStream;
  /**
   * optional MediaStream for the remote audio tracks.
   * This is typically used to play the remote audio stream in the application.
   */
  remoteStream?: MediaStream;
  /**
   * Peer connection options for the WebRTC call.
   * These options can be used to customize the behavior of the WebRTC peer connection.
   * For example, you can specify ICE servers, transport policies, and more.
   */
  peerConnectionOptions?: {
    prefetchIceCandidates?: boolean;
    /**
     * Enable Trickle ICE for this call.
     *
     * When true, the SDK sends the initial SDP immediately and trickles ICE
     * candidates through telnyx_rtc.candidate / telnyx_rtc.endOfCandidates.
     * Defaults to false to preserve legacy full-ICE-gathering behavior.
     */
    useTrickleIce?: boolean;
    /**
     * The ICE servers to use for the WebRTC connection.
     * This can include STUN and TURN servers.
     * @example
     * ```typescript
     * [
     *   { urls: 'stun:stun.l.google.com:19302' },
     *   { urls: 'turn:turn.example.com', username: 'user', credential: 'password' },
     * ]
     * ```
     */
    iceServers?: RTCIceServer[];
    /**
     * The ICE transport policy to use for the WebRTC connection.
     * This can be 'all', 'relay', 'nohost', or 'none'.
     * @default 'all'
     */
    iceTransportPolicy?: RTCIceTransportPolicy;
    /**
     * The bundle policy to use for the WebRTC connection.
     * This can be 'balanced', 'max-compat', or 'max-bundle'.
     * @default 'balanced'
     */
    bundlePolicy?: RTCBundlePolicy;
    /**
     * The RTCP mux policy to use for the WebRTC connection.
     * This can be 'require' or 'negotiate'.
     * @default 'require'
     */
    rtcpMuxPolicy?: RTCRtcpMuxPolicy;
  };
  remoteCallerIdName?: string;
  remoteCallerIdNumber?: string;
}
