// 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.

// @dart = 2.8

import 'dart:io';

import 'package:flutter_devicelab/framework/devices.dart';
import 'package:flutter_devicelab/framework/framework.dart';
import 'package:flutter_devicelab/framework/host_agent.dart';
import 'package:flutter_devicelab/framework/task_result.dart';
import 'package:flutter_devicelab/framework/utils.dart';
import 'package:path/path.dart' as path;

Future<void> main() async {
  deviceOperatingSystem = DeviceOperatingSystem.ios;

  await task(() async {
    final String projectDirectory = '${flutterDirectory.path}/dev/integration_tests/flutter_gallery';

    await inDirectory(projectDirectory, () async {
      section('Build clean');

      await flutter('clean');

      section('Build gallery app');

      await flutter(
        'build',
        options: <String>[
          'ios',
          '-v',
          '--release',
          '--config-only',
        ],
      );
    });

    section('Run platform unit tests');

    final Device device = await devices.workingDevice;
    final Map<String, String> environment = Platform.environment;
    // If not running on CI, inject the Flutter team code signing properties.
    final String developmentTeam = environment['FLUTTER_XCODE_DEVELOPMENT_TEAM'] ?? 'S8QB4VV633';
    final String codeSignStyle = environment['FLUTTER_XCODE_CODE_SIGN_STYLE'];
    final String provisioningProfile = environment['FLUTTER_XCODE_PROVISIONING_PROFILE_SPECIFIER'];

    final String resultBundleTemp = Directory.systemTemp.createTempSync('flutter_native_ui_tests_ios32_xcresult.').path;
    final String resultBundlePath = path.join(resultBundleTemp, 'result');
    final int testResultExit = await exec(
      'xcodebuild',
      <String>[
        '-workspace',
        'Runner.xcworkspace',
        '-scheme',
        'Runner',
        '-configuration',
        'Release',
        '-destination',
        'id=${device.deviceId}',
        '-resultBundlePath',
        resultBundlePath,
        'test',
        'COMPILER_INDEX_STORE_ENABLE=NO',
        'DEVELOPMENT_TEAM=$developmentTeam',
        if (codeSignStyle != null)
          'CODE_SIGN_STYLE=$codeSignStyle',
        if (provisioningProfile != null)
          'PROVISIONING_PROFILE_SPECIFIER=$provisioningProfile',
      ],
      workingDirectory: path.join(projectDirectory, 'ios'),
      canFail: true,
    );

    if (testResultExit != 0) {
      final Directory dumpDirectory = hostAgent.dumpDirectory;
      if (dumpDirectory != null) {
        // Zip the test results to the artifacts directory for upload.
        final String zipPath = path.join(dumpDirectory.path,
            'native_ui_tests_ios32-${DateTime.now().toLocal().toIso8601String()}.zip');
        await exec(
          'zip',
          <String>[
            '-r',
            '-9',
            zipPath,
            'result.xcresult',
          ],
          workingDirectory: resultBundleTemp,
          canFail: true, // Best effort to get the logs.
        );
      }

      return TaskResult.failure('Platform unit tests failed');
    }

    return TaskResult.success(null);
  });
}