// 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 'package:file/file.dart';
import 'package:flutter_tools/src/base/io.dart';
import 'package:flutter_tools/src/base/logger.dart';
import 'package:flutter_tools/src/base/os.dart';

import '../integration.shard/test_utils.dart';
import '../src/common.dart';

Future<void> main() async {
  test('verify the dart binary arch matches the host arch', () async {
    final HostPlatform dartArch = _identifyMacBinaryArch(_dartBinary.path);
    final OperatingSystemUtils os = OperatingSystemUtils(
      processManager: processManager,
      fileSystem: fileSystem,
      platform: platform,
      logger: BufferLogger.test(),
    );
    expect(dartArch, os.hostPlatform);
  }, skip: !platform.isMacOS); // [intended] Calls macOS-specific commands
}

// Call `file` on the path and parse the output.
HostPlatform _identifyMacBinaryArch(String path) {
  // Expect STDOUT like:
  //   bin/cache/dart-sdk/bin/dart: Mach-O 64-bit executable x86_64
  final RegExp pattern = RegExp(r'Mach-O 64-bit executable (\w+)');
  final ProcessResult result = processManager.runSync(
    <String>['file', _dartBinary.path],
  );
  final RegExpMatch? match = pattern.firstMatch(result.stdout as String);
  if (match == null) {
    fail('Unrecognized STDOUT from `file`: "${result.stdout}"');
  }
  switch (match.group(1)) {
    case 'x86_64':
      return HostPlatform.darwin_x64;
    case 'arm64':
      return HostPlatform.darwin_arm;
    default:
      fail('Unexpected architecture ${match.group(1)}');
  }
}

final String _flutterRootPath = getFlutterRoot();
final Directory _flutterRoot = fileSystem.directory(_flutterRootPath);
final File _dartBinary = _flutterRoot
    .childDirectory('bin')
    .childDirectory('cache')
    .childDirectory('dart-sdk')
    .childDirectory('bin')
    .childFile('dart')
    .absolute;
