// 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 'package:file/file.dart';
import 'package:file/memory.dart';
import 'package:flutter_plugin_tools/src/common/core.dart';
import 'package:flutter_plugin_tools/src/common/plugin_utils.dart';
import 'package:flutter_plugin_tools/src/common/repository_package.dart';
import 'package:test/test.dart';

import '../util.dart';

void main() {
  late FileSystem fileSystem;
  late Directory packagesDir;

  setUp(() {
    fileSystem = MemoryFileSystem();
    packagesDir = createPackagesDirectory(fileSystem: fileSystem);
  });

  group('pluginSupportsPlatform', () {
    test('no platforms', () async {
      final RepositoryPackage plugin =
          RepositoryPackage(createFakePlugin('plugin', packagesDir));

      expect(pluginSupportsPlatform(platformAndroid, plugin), isFalse);
      expect(pluginSupportsPlatform(platformIOS, plugin), isFalse);
      expect(pluginSupportsPlatform(platformLinux, plugin), isFalse);
      expect(pluginSupportsPlatform(platformMacOS, plugin), isFalse);
      expect(pluginSupportsPlatform(platformWeb, plugin), isFalse);
      expect(pluginSupportsPlatform(platformWindows, plugin), isFalse);
    });

    test('all platforms', () async {
      final RepositoryPackage plugin = RepositoryPackage(createFakePlugin(
          'plugin', packagesDir,
          platformSupport: <String, PlatformDetails>{
            platformAndroid: const PlatformDetails(PlatformSupport.inline),
            platformIOS: const PlatformDetails(PlatformSupport.inline),
            platformLinux: const PlatformDetails(PlatformSupport.inline),
            platformMacOS: const PlatformDetails(PlatformSupport.inline),
            platformWeb: const PlatformDetails(PlatformSupport.inline),
            platformWindows: const PlatformDetails(PlatformSupport.inline),
          }));

      expect(pluginSupportsPlatform(platformAndroid, plugin), isTrue);
      expect(pluginSupportsPlatform(platformIOS, plugin), isTrue);
      expect(pluginSupportsPlatform(platformLinux, plugin), isTrue);
      expect(pluginSupportsPlatform(platformMacOS, plugin), isTrue);
      expect(pluginSupportsPlatform(platformWeb, plugin), isTrue);
      expect(pluginSupportsPlatform(platformWindows, plugin), isTrue);
    });

    test('some platforms', () async {
      final RepositoryPackage plugin = RepositoryPackage(createFakePlugin(
          'plugin', packagesDir,
          platformSupport: <String, PlatformDetails>{
            platformAndroid: const PlatformDetails(PlatformSupport.inline),
            platformLinux: const PlatformDetails(PlatformSupport.inline),
            platformWeb: const PlatformDetails(PlatformSupport.inline),
          }));

      expect(pluginSupportsPlatform(platformAndroid, plugin), isTrue);
      expect(pluginSupportsPlatform(platformIOS, plugin), isFalse);
      expect(pluginSupportsPlatform(platformLinux, plugin), isTrue);
      expect(pluginSupportsPlatform(platformMacOS, plugin), isFalse);
      expect(pluginSupportsPlatform(platformWeb, plugin), isTrue);
      expect(pluginSupportsPlatform(platformWindows, plugin), isFalse);
    });

    test('inline plugins are only detected as inline', () async {
      final RepositoryPackage plugin = RepositoryPackage(createFakePlugin(
          'plugin', packagesDir,
          platformSupport: <String, PlatformDetails>{
            platformAndroid: const PlatformDetails(PlatformSupport.inline),
            platformIOS: const PlatformDetails(PlatformSupport.inline),
            platformLinux: const PlatformDetails(PlatformSupport.inline),
            platformMacOS: const PlatformDetails(PlatformSupport.inline),
            platformWeb: const PlatformDetails(PlatformSupport.inline),
            platformWindows: const PlatformDetails(PlatformSupport.inline),
          }));

      expect(
          pluginSupportsPlatform(platformAndroid, plugin,
              requiredMode: PlatformSupport.inline),
          isTrue);
      expect(
          pluginSupportsPlatform(platformAndroid, plugin,
              requiredMode: PlatformSupport.federated),
          isFalse);
      expect(
          pluginSupportsPlatform(platformIOS, plugin,
              requiredMode: PlatformSupport.inline),
          isTrue);
      expect(
          pluginSupportsPlatform(platformIOS, plugin,
              requiredMode: PlatformSupport.federated),
          isFalse);
      expect(
          pluginSupportsPlatform(platformLinux, plugin,
              requiredMode: PlatformSupport.inline),
          isTrue);
      expect(
          pluginSupportsPlatform(platformLinux, plugin,
              requiredMode: PlatformSupport.federated),
          isFalse);
      expect(
          pluginSupportsPlatform(platformMacOS, plugin,
              requiredMode: PlatformSupport.inline),
          isTrue);
      expect(
          pluginSupportsPlatform(platformMacOS, plugin,
              requiredMode: PlatformSupport.federated),
          isFalse);
      expect(
          pluginSupportsPlatform(platformWeb, plugin,
              requiredMode: PlatformSupport.inline),
          isTrue);
      expect(
          pluginSupportsPlatform(platformWeb, plugin,
              requiredMode: PlatformSupport.federated),
          isFalse);
      expect(
          pluginSupportsPlatform(platformWindows, plugin,
              requiredMode: PlatformSupport.inline),
          isTrue);
      expect(
          pluginSupportsPlatform(platformWindows, plugin,
              requiredMode: PlatformSupport.federated),
          isFalse);
    });

    test('federated plugins are only detected as federated', () async {
      final RepositoryPackage plugin = RepositoryPackage(createFakePlugin(
          'plugin', packagesDir,
          platformSupport: <String, PlatformDetails>{
            platformAndroid: const PlatformDetails(PlatformSupport.federated),
            platformIOS: const PlatformDetails(PlatformSupport.federated),
            platformLinux: const PlatformDetails(PlatformSupport.federated),
            platformMacOS: const PlatformDetails(PlatformSupport.federated),
            platformWeb: const PlatformDetails(PlatformSupport.federated),
            platformWindows: const PlatformDetails(PlatformSupport.federated),
          }));

      expect(
          pluginSupportsPlatform(platformAndroid, plugin,
              requiredMode: PlatformSupport.federated),
          isTrue);
      expect(
          pluginSupportsPlatform(platformAndroid, plugin,
              requiredMode: PlatformSupport.inline),
          isFalse);
      expect(
          pluginSupportsPlatform(platformIOS, plugin,
              requiredMode: PlatformSupport.federated),
          isTrue);
      expect(
          pluginSupportsPlatform(platformIOS, plugin,
              requiredMode: PlatformSupport.inline),
          isFalse);
      expect(
          pluginSupportsPlatform(platformLinux, plugin,
              requiredMode: PlatformSupport.federated),
          isTrue);
      expect(
          pluginSupportsPlatform(platformLinux, plugin,
              requiredMode: PlatformSupport.inline),
          isFalse);
      expect(
          pluginSupportsPlatform(platformMacOS, plugin,
              requiredMode: PlatformSupport.federated),
          isTrue);
      expect(
          pluginSupportsPlatform(platformMacOS, plugin,
              requiredMode: PlatformSupport.inline),
          isFalse);
      expect(
          pluginSupportsPlatform(platformWeb, plugin,
              requiredMode: PlatformSupport.federated),
          isTrue);
      expect(
          pluginSupportsPlatform(platformWeb, plugin,
              requiredMode: PlatformSupport.inline),
          isFalse);
      expect(
          pluginSupportsPlatform(platformWindows, plugin,
              requiredMode: PlatformSupport.federated),
          isTrue);
      expect(
          pluginSupportsPlatform(platformWindows, plugin,
              requiredMode: PlatformSupport.inline),
          isFalse);
    });

    test('windows without variants is only win32', () async {
      final RepositoryPackage plugin = RepositoryPackage(createFakePlugin(
        'plugin',
        packagesDir,
        platformSupport: <String, PlatformDetails>{
          platformWindows: const PlatformDetails(PlatformSupport.inline),
        },
      ));

      expect(
          pluginSupportsPlatform(platformWindows, plugin,
              variant: platformVariantWin32),
          isTrue);
      expect(
          pluginSupportsPlatform(platformWindows, plugin,
              variant: platformVariantWinUwp),
          isFalse);
    });

    test('windows with both variants matches win32 and winuwp', () async {
      final RepositoryPackage plugin = RepositoryPackage(createFakePlugin(
          'plugin', packagesDir,
          platformSupport: <String, PlatformDetails>{
            platformWindows: const PlatformDetails(
              PlatformSupport.federated,
              variants: <String>[platformVariantWin32, platformVariantWinUwp],
            ),
          }));

      expect(
          pluginSupportsPlatform(platformWindows, plugin,
              variant: platformVariantWin32),
          isTrue);
      expect(
          pluginSupportsPlatform(platformWindows, plugin,
              variant: platformVariantWinUwp),
          isTrue);
    });

    test('win32 plugin is only win32', () async {
      final RepositoryPackage plugin = RepositoryPackage(createFakePlugin(
          'plugin', packagesDir,
          platformSupport: <String, PlatformDetails>{
            platformWindows: const PlatformDetails(
              PlatformSupport.federated,
              variants: <String>[platformVariantWin32],
            ),
          }));

      expect(
          pluginSupportsPlatform(platformWindows, plugin,
              variant: platformVariantWin32),
          isTrue);
      expect(
          pluginSupportsPlatform(platformWindows, plugin,
              variant: platformVariantWinUwp),
          isFalse);
    });

    test('winup plugin is only winuwp', () async {
      final RepositoryPackage plugin = RepositoryPackage(createFakePlugin(
        'plugin',
        packagesDir,
        platformSupport: <String, PlatformDetails>{
          platformWindows: const PlatformDetails(PlatformSupport.federated,
              variants: <String>[platformVariantWinUwp]),
        },
      ));

      expect(
          pluginSupportsPlatform(platformWindows, plugin,
              variant: platformVariantWin32),
          isFalse);
      expect(
          pluginSupportsPlatform(platformWindows, plugin,
              variant: platformVariantWinUwp),
          isTrue);
    });
  });

  group('pluginHasNativeCodeForPlatform', () {
    test('returns false for web', () async {
      final RepositoryPackage plugin = RepositoryPackage(createFakePlugin(
        'plugin',
        packagesDir,
        platformSupport: <String, PlatformDetails>{
          platformWeb: const PlatformDetails(PlatformSupport.inline),
        },
      ));

      expect(pluginHasNativeCodeForPlatform(platformWeb, plugin), isFalse);
    });

    test('returns false for a native-only plugin', () async {
      final RepositoryPackage plugin = RepositoryPackage(createFakePlugin(
        'plugin',
        packagesDir,
        platformSupport: <String, PlatformDetails>{
          platformLinux: const PlatformDetails(PlatformSupport.inline),
          platformMacOS: const PlatformDetails(PlatformSupport.inline),
          platformWindows: const PlatformDetails(PlatformSupport.inline),
        },
      ));

      expect(pluginHasNativeCodeForPlatform(platformLinux, plugin), isTrue);
      expect(pluginHasNativeCodeForPlatform(platformMacOS, plugin), isTrue);
      expect(pluginHasNativeCodeForPlatform(platformWindows, plugin), isTrue);
    });

    test('returns true for a native+Dart plugin', () async {
      final RepositoryPackage plugin = RepositoryPackage(createFakePlugin(
        'plugin',
        packagesDir,
        platformSupport: <String, PlatformDetails>{
          platformLinux: const PlatformDetails(PlatformSupport.inline,
              hasNativeCode: true, hasDartCode: true),
          platformMacOS: const PlatformDetails(PlatformSupport.inline,
              hasNativeCode: true, hasDartCode: true),
          platformWindows: const PlatformDetails(PlatformSupport.inline,
              hasNativeCode: true, hasDartCode: true),
        },
      ));

      expect(pluginHasNativeCodeForPlatform(platformLinux, plugin), isTrue);
      expect(pluginHasNativeCodeForPlatform(platformMacOS, plugin), isTrue);
      expect(pluginHasNativeCodeForPlatform(platformWindows, plugin), isTrue);
    });

    test('returns false for a Dart-only plugin', () async {
      final RepositoryPackage plugin = RepositoryPackage(createFakePlugin(
        'plugin',
        packagesDir,
        platformSupport: <String, PlatformDetails>{
          platformLinux: const PlatformDetails(PlatformSupport.inline,
              hasNativeCode: false, hasDartCode: true),
          platformMacOS: const PlatformDetails(PlatformSupport.inline,
              hasNativeCode: false, hasDartCode: true),
          platformWindows: const PlatformDetails(PlatformSupport.inline,
              hasNativeCode: false, hasDartCode: true),
        },
      ));

      expect(pluginHasNativeCodeForPlatform(platformLinux, plugin), isFalse);
      expect(pluginHasNativeCodeForPlatform(platformMacOS, plugin), isFalse);
      expect(pluginHasNativeCodeForPlatform(platformWindows, plugin), isFalse);
    });
  });
}
