// Copyright 2014 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:async';
import 'dart:io';

import '../framework/adb.dart';
import '../framework/framework.dart';
import '../framework/utils.dart';
import 'save_catalog_screenshots.dart' show saveCatalogScreenshots;


Future<TaskResult> samplePageCatalogGenerator(String authorizationToken) async {
  final Device device = await devices.workingDevice;
  await device.unlock();
  final String deviceId = device.deviceId;

  final Directory catalogDirectory = dir('${flutterDirectory.path}/examples/catalog');
  await inDirectory<void>(catalogDirectory, () async {
    await flutter('packages', options: <String>['get']);

    final String commit = await getCurrentFlutterRepoCommit();

    await dart(<String>['bin/sample_page.dart', commit]);

    await flutter('drive', options: <String>[
      '--target',
      'test_driver/screenshot.dart',
      '--device-id',
      deviceId,
    ]);

    await saveCatalogScreenshots(
      directory: dir('${flutterDirectory.path}/examples/catalog/.generated'),
      commit: commit,
      token: authorizationToken, // TODO(fujino): workaround auth token for local runs
      prefix: deviceOperatingSystem == DeviceOperatingSystem.ios ? 'ios_' : '',
    );
  });

  return TaskResult.success(null);
}
