import 'dart:typed_data';

import 'package:flutter_test/flutter_test.dart';
import 'package:tane/data/variety_repository.dart';
import 'package:tane/db/database.dart';

import '../support/test_support.dart';

void main() {
  late AppDatabase db;
  late VarietyRepository repo;

  setUp(() {
    db = newTestDatabase();
    repo = newTestRepository(db);
  });
  tearDown(() => db.close());

  Uint8List photo(int seed) => Uint8List.fromList([seed, seed, seed]);

  test(
    'a captured draft is hidden from the list but shown in the tray',
    () async {
      final id = await repo.addDraftVariety(photo(1));

      // Not in the main inventory…
      expect(await repo.watchInventory().first, isEmpty);

      // …but in the "to catalogue" tray, with its photo and no name yet.
      final drafts = await repo.watchDrafts().first;
      expect(drafts, hasLength(1));
      expect(drafts.single.id, id);
      expect(drafts.single.isDraft, isTrue);
      expect(drafts.single.label, '');
      expect(drafts.single.photo, isNotNull);
    },
  );

  test(
    'naming a draft promotes it into the list and out of the tray',
    () async {
      final id = await repo.addDraftVariety(photo(2));
      await repo.nameDraft(id, 'Grandma tomato');

      expect(await repo.watchDrafts().first, isEmpty);
      final list = await repo.watchInventory().first;
      expect(list.single.id, id);
      expect(list.single.label, 'Grandma tomato');
      expect(list.single.isDraft, isFalse);
      // The captured photo survived the promotion.
      expect(list.single.photo, isNotNull);
    },
  );

  test('the tray is ordered newest-capture first', () async {
    final first = await repo.addDraftVariety(photo(1));
    final second = await repo.addDraftVariety(photo(2));
    final drafts = await repo.watchDrafts().first;
    expect(drafts.map((d) => d.id).toList(), [second, first]);
  });
}
