// 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:flutter_test/flutter_test.dart';
import 'package:quick_actions_ios/messages.g.dart';
import 'package:quick_actions_ios/quick_actions_ios.dart';
import 'package:quick_actions_platform_interface/quick_actions_platform_interface.dart';

void main() {
  TestWidgetsFlutterBinding.ensureInitialized();

  final _FakeQuickActionsApi api = _FakeQuickActionsApi();
  final QuickActionsIos quickActions = QuickActionsIos(api: api);

  test('registerWith() registers correct instance', () {
    QuickActionsIos.registerWith();
    expect(QuickActionsPlatform.instance, isA<QuickActionsIos>());
  });

  group('#initialize', () {
    test('initialize', () {
      expect(quickActions.initialize((_) {}), completes);
    });
  });

  test('setShortcutItems', () async {
    await quickActions.initialize((String type) {});
    const ShortcutItem item =
        ShortcutItem(type: 'test', localizedTitle: 'title', icon: 'icon.svg');
    await quickActions.setShortcutItems(<ShortcutItem>[item]);

    expect(api.items.first.type, item.type);
    expect(api.items.first.localizedTitle, item.localizedTitle);
    expect(api.items.first.icon, item.icon);
  });

  test('clearShortCutItems', () {
    quickActions.initialize((String type) {});
    const ShortcutItem item =
        ShortcutItem(type: 'test', localizedTitle: 'title', icon: 'icon.svg');
    quickActions.setShortcutItems(<ShortcutItem>[item]);
    quickActions.clearShortcutItems();

    expect(api.items.isEmpty, true);
  });

  test('Shortcut item can be constructed', () {
    const String type = 'type';
    const String localizedTitle = 'title';
    const String icon = 'foo';

    const ShortcutItem item =
        ShortcutItem(type: type, localizedTitle: localizedTitle, icon: icon);

    expect(item.type, type);
    expect(item.localizedTitle, localizedTitle);
    expect(item.icon, icon);
  });
}

class _FakeQuickActionsApi implements IOSQuickActionsApi {
  List<ShortcutItem> items = <ShortcutItem>[];
  bool getLaunchActionCalled = false;

  @override
  Future<void> clearShortcutItems() async {
    items = <ShortcutItem>[];
    return;
  }

  @override
  Future<void> setShortcutItems(List<ShortcutItemMessage?> itemsList) async {
    await clearShortcutItems();
    for (final ShortcutItemMessage? element in itemsList) {
      items.add(shortcutItemMessageToShortcutItem(element!));
    }
  }
}

/// Conversion tool to change [ShortcutItemMessage] back to [ShortcutItem]
ShortcutItem shortcutItemMessageToShortcutItem(ShortcutItemMessage item) {
  return ShortcutItem(
    type: item.type,
    localizedTitle: item.localizedTitle,
    icon: item.icon,
  );
}
