/*
 * Copyright (C) 2017 The Android Open Source Project
 *
 * Licensed 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 androidx.media3.exoplayer.source;

import androidx.annotation.Nullable;
import androidx.media3.common.C;
import androidx.media3.common.C.DataType;
import androidx.media3.common.C.SelectionReason;
import androidx.media3.common.C.TrackType;
import androidx.media3.common.Format;
import androidx.media3.common.util.UnstableApi;

/** Descriptor for data being loaded or selected by a {@link MediaSource}. */
@UnstableApi
public final class MediaLoadData {

  /** The {@link DataType data type}. */
  public final @DataType int dataType;
  /**
   * One of the {@link TrackType track types}, which is a media track type if the data corresponds
   * to media of a specific type, or {@link C#TRACK_TYPE_UNKNOWN} otherwise.
   */
  public final @TrackType int trackType;
  /**
   * The format of the track to which the data belongs. Null if the data does not belong to a
   * specific track.
   */
  @Nullable public final Format trackFormat;
  /**
   * One of the {@link SelectionReason selection reasons} if the data belongs to a track. {@link
   * C#SELECTION_REASON_UNKNOWN} otherwise.
   */
  public final @C.SelectionReason int trackSelectionReason;
  /**
   * Optional data associated with the selection of the track to which the data belongs. Null if the
   * data does not belong to a track.
   */
  @Nullable public final Object trackSelectionData;
  /**
   * The start time of the media in the {@link MediaPeriod}, or {@link C#TIME_UNSET} if the data
   * does not belong to a specific {@link MediaPeriod}.
   */
  public final long mediaStartTimeMs;
  /**
   * The end time of the media in the {@link MediaPeriod}, or {@link C#TIME_UNSET} if the data does
   * not belong to a specific {@link MediaPeriod} or the end time is unknown.
   */
  public final long mediaEndTimeMs;

  /** Creates an instance with the given {@link #dataType}. */
  public MediaLoadData(@DataType int dataType) {
    this(
        dataType,
        /* trackType= */ C.TRACK_TYPE_UNKNOWN,
        /* trackFormat= */ null,
        /* trackSelectionReason= */ C.SELECTION_REASON_UNKNOWN,
        /* trackSelectionData= */ null,
        /* mediaStartTimeMs= */ C.TIME_UNSET,
        /* mediaEndTimeMs= */ C.TIME_UNSET);
  }

  /**
   * Creates media load data.
   *
   * @param dataType See {@link #dataType}.
   * @param trackType See {@link #trackType}.
   * @param trackFormat See {@link #trackFormat}.
   * @param trackSelectionReason See {@link #trackSelectionReason}.
   * @param trackSelectionData See {@link #trackSelectionData}.
   * @param mediaStartTimeMs See {@link #mediaStartTimeMs}.
   * @param mediaEndTimeMs See {@link #mediaEndTimeMs}.
   */
  public MediaLoadData(
      @DataType int dataType,
      @TrackType int trackType,
      @Nullable Format trackFormat,
      @SelectionReason int trackSelectionReason,
      @Nullable Object trackSelectionData,
      long mediaStartTimeMs,
      long mediaEndTimeMs) {
    this.dataType = dataType;
    this.trackType = trackType;
    this.trackFormat = trackFormat;
    this.trackSelectionReason = trackSelectionReason;
    this.trackSelectionData = trackSelectionData;
    this.mediaStartTimeMs = mediaStartTimeMs;
    this.mediaEndTimeMs = mediaEndTimeMs;
  }
}
