// Copyright 2013 The Flutter 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 'dart:html';
import 'dart:ui';

import 'package:camera_web/src/camera.dart';
import 'package:camera_web/src/camera_settings.dart';
import 'package:cross_file/cross_file.dart';
import 'package:mocktail/mocktail.dart';

class MockWindow extends Mock implements Window {}

class MockNavigator extends Mock implements Navigator {}

class MockMediaDevices extends Mock implements MediaDevices {}

class MockCameraSettings extends Mock implements CameraSettings {}

class MockMediaStreamTrack extends Mock implements MediaStreamTrack {}

class MockCamera extends Mock implements Camera {}

class MockXFile extends Mock implements XFile {}

/// A fake [MediaStream] that returns the provided [_videoTracks].
class FakeMediaStream extends Fake implements MediaStream {
  FakeMediaStream(this._videoTracks);

  final List<MediaStreamTrack> _videoTracks;

  @override
  List<MediaStreamTrack> getVideoTracks() => _videoTracks;
}

/// A fake [MediaDeviceInfo] that returns the provided [_deviceId], [_label] and [_kind].
class FakeMediaDeviceInfo extends Fake implements MediaDeviceInfo {
  FakeMediaDeviceInfo(this._deviceId, this._label, this._kind);

  final String _deviceId;
  final String _label;
  final String _kind;

  @override
  String? get deviceId => _deviceId;

  @override
  String? get label => _label;

  @override
  String? get kind => _kind;
}

/// A fake [DomException] that returns the provided error [_name].
class FakeDomException extends Fake implements DomException {
  FakeDomException(this._name);

  final String _name;

  @override
  String get name => _name;
}

/// Returns a video element with a blank stream of size [videoSize].
///
/// Can be used to mock a video stream:
/// ```dart
/// final videoElement = getVideoElementWithBlankStream(Size(100, 100));
/// final videoStream = videoElement.captureStream();
/// ```
VideoElement getVideoElementWithBlankStream(Size videoSize) {
  final canvasElement = CanvasElement(
    width: videoSize.width.toInt(),
    height: videoSize.height.toInt(),
  )..context2D.fillRect(0, 0, videoSize.width, videoSize.height);

  final videoElement = VideoElement()
    ..srcObject = canvasElement.captureStream();

  return videoElement;
}
