// Copyright 2018 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

import 'package:lib.schemas.dart/com/fuchsia/media/media.dart';
import 'package:lib.widgets/model.dart';

/// Tracks progress of Media playback
class MediaProgress extends Model {
  /// Constructor
  MediaProgress(this._durationMsec, this._normalizedProgress);

  /// Named constructor for converting an Entity into this model
  MediaProgress.fromEntity(MediaProgressEntityData entity) {
    _durationMsec = entity.durationMsec;
    _normalizedProgress = entity.normalizedProgress;
  }

  /// Generate and Entity object capable of being sent over a Link
  MediaProgressEntityData toEntity() =>
      new MediaProgressEntityData(_durationMsec, _normalizedProgress);

  /// Progress through media in the range [0..1]
  double _normalizedProgress;

  /// Full length of the media
  int _durationMsec;

  /// Progress through media as an absolute Duration.
  Duration get position => new Duration(milliseconds: positionMsec);

  /// Progress through media as absolute milliseconds.
  int get positionMsec => (_durationMsec * _normalizedProgress).floor();

  /// Progress of media playback normalized in the range [0.0 .. 1.0];
  double get normalizedProgress => _normalizedProgress;

  /// Duration fo the vide in milliseconds
  int get durationMsec => _durationMsec;

  /// Update the duration of the media.
  set durationMsec(int durationMsec) {
    _durationMsec = durationMsec;
    notifyListeners();
  }

  /// Update the normalized progress of the media. This should be called
  /// with the value from the media player and is clamped to the range
  /// [0.0 .. 1.0].
  set normalizedProgress(double normalizedProgress) {
    _normalizedProgress = normalizedProgress;
    notifyListeners();
  }
}
