import 'package:camera/camera.dart';
import 'package:camera_platform_interface/camera_platform_interface.dart';
import 'package:flutter/widgets.dart';
import 'package:flutter_test/flutter_test.dart';

import 'camera_test.dart';
import 'utils/method_channel_mock.dart';

void main() {
  WidgetsFlutterBinding.ensureInitialized();

  setUp(() {
    CameraPlatform.instance = MockCameraPlatform();
  });

  test('startImageStream() throws $CameraException when uninitialized', () {
    CameraController cameraController = CameraController(
        CameraDescription(
            name: 'cam',
            lensDirection: CameraLensDirection.back,
            sensorOrientation: 90),
        ResolutionPreset.max);

    expect(
      () => cameraController.startImageStream((image) => null),
      throwsA(
        isA<CameraException>()
            .having(
              (error) => error.code,
              'code',
              'Uninitialized CameraController',
            )
            .having(
              (error) => error.description,
              'description',
              'startImageStream() was called on an uninitialized CameraController.',
            ),
      ),
    );
  });

  test('startImageStream() throws $CameraException when recording videos',
      () async {
    CameraController cameraController = CameraController(
        CameraDescription(
            name: 'cam',
            lensDirection: CameraLensDirection.back,
            sensorOrientation: 90),
        ResolutionPreset.max);

    await cameraController.initialize();

    cameraController.value =
        cameraController.value.copyWith(isRecordingVideo: true);

    expect(
        () => cameraController.startImageStream((image) => null),
        throwsA(isA<CameraException>().having(
          (error) => error.description,
          'A video recording is already started.',
          'startImageStream was called while a video is being recorded.',
        )));
  });
  test(
      'startImageStream() throws $CameraException when already streaming images',
      () async {
    CameraController cameraController = CameraController(
        CameraDescription(
            name: 'cam',
            lensDirection: CameraLensDirection.back,
            sensorOrientation: 90),
        ResolutionPreset.max);
    await cameraController.initialize();

    cameraController.value =
        cameraController.value.copyWith(isStreamingImages: true);
    expect(
        () => cameraController.startImageStream((image) => null),
        throwsA(isA<CameraException>().having(
          (error) => error.description,
          'A camera has started streaming images.',
          'startImageStream was called while a camera was streaming images.',
        )));
  });

  test('startImageStream() calls CameraPlatform', () async {
    MethodChannelMock cameraChannelMock = MethodChannelMock(
        channelName: 'plugins.flutter.io/camera',
        methods: {'startImageStream': {}});
    MethodChannelMock streamChannelMock = MethodChannelMock(
        channelName: 'plugins.flutter.io/camera/imageStream',
        methods: {'listen': {}});

    CameraController cameraController = CameraController(
        CameraDescription(
            name: 'cam',
            lensDirection: CameraLensDirection.back,
            sensorOrientation: 90),
        ResolutionPreset.max);
    await cameraController.initialize();

    await cameraController.startImageStream((image) => null);

    expect(cameraChannelMock.log,
        <Matcher>[isMethodCall('startImageStream', arguments: null)]);
    expect(streamChannelMock.log,
        <Matcher>[isMethodCall('listen', arguments: null)]);
  });

  test('stopImageStream() throws $CameraException when uninitialized', () {
    CameraController cameraController = CameraController(
        CameraDescription(
            name: 'cam',
            lensDirection: CameraLensDirection.back,
            sensorOrientation: 90),
        ResolutionPreset.max);

    expect(
      cameraController.stopImageStream,
      throwsA(
        isA<CameraException>()
            .having(
              (error) => error.code,
              'code',
              'Uninitialized CameraController',
            )
            .having(
              (error) => error.description,
              'description',
              'stopImageStream() was called on an uninitialized CameraController.',
            ),
      ),
    );
  });

  test('stopImageStream() throws $CameraException when recording videos',
      () async {
    CameraController cameraController = CameraController(
        CameraDescription(
            name: 'cam',
            lensDirection: CameraLensDirection.back,
            sensorOrientation: 90),
        ResolutionPreset.max);
    await cameraController.initialize();

    await cameraController.startImageStream((image) => null);
    cameraController.value =
        cameraController.value.copyWith(isRecordingVideo: true);
    expect(
        cameraController.stopImageStream,
        throwsA(isA<CameraException>().having(
          (error) => error.description,
          'A video recording is already started.',
          'stopImageStream was called while a video is being recorded.',
        )));
  });

  test('stopImageStream() throws $CameraException when not streaming images',
      () async {
    CameraController cameraController = CameraController(
        CameraDescription(
            name: 'cam',
            lensDirection: CameraLensDirection.back,
            sensorOrientation: 90),
        ResolutionPreset.max);
    await cameraController.initialize();

    expect(
        cameraController.stopImageStream,
        throwsA(isA<CameraException>().having(
          (error) => error.description,
          'No camera is streaming images',
          'stopImageStream was called when no camera is streaming images.',
        )));
  });

  test('stopImageStream() intended behaviour', () async {
    MethodChannelMock cameraChannelMock = MethodChannelMock(
        channelName: 'plugins.flutter.io/camera',
        methods: {'startImageStream': {}, 'stopImageStream': {}});
    MethodChannelMock streamChannelMock = MethodChannelMock(
        channelName: 'plugins.flutter.io/camera/imageStream',
        methods: {'listen': {}, 'cancel': {}});

    CameraController cameraController = CameraController(
        CameraDescription(
            name: 'cam',
            lensDirection: CameraLensDirection.back,
            sensorOrientation: 90),
        ResolutionPreset.max);
    await cameraController.initialize();
    await cameraController.startImageStream((image) => null);
    await cameraController.stopImageStream();

    expect(cameraChannelMock.log, <Matcher>[
      isMethodCall('startImageStream', arguments: null),
      isMethodCall('stopImageStream', arguments: null)
    ]);

    expect(streamChannelMock.log, <Matcher>[
      isMethodCall('listen', arguments: null),
      isMethodCall('cancel', arguments: null)
    ]);
  });
}
