// Copyright 2013 The Flutter Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

import 'dart:convert';
import 'dart:io' as io;

import 'package:file/file.dart';
import 'package:platform/platform.dart';

import 'core.dart';
import 'output_utils.dart';
import 'process_runner.dart';

const String _xcodeBuildCommand = 'xcodebuild';
const String _xcRunCommand = 'xcrun';

/// A utility class for interacting with the installed version of Xcode.
class Xcode {
  /// Creates an instance that runs commands with the given [processRunner].
  ///
  /// If [log] is true, commands run by this instance will long various status
  /// messages.
  Xcode({this.processRunner = const ProcessRunner(), this.log = false});

  /// The [ProcessRunner] used to run commands. Overridable for testing.
  final ProcessRunner processRunner;

  /// Whether or not to log when running commands.
  final bool log;

  /// Runs an `xcodebuild` in [directory] with the given parameters.
  Future<int> runXcodeBuild(
    Directory exampleDirectory,
    String targetPlatform, {
    List<String> actions = const <String>['build'],
    required String workspace,
    required String scheme,
    String? configuration,
    List<String> extraFlags = const <String>[],
    required Platform hostPlatform,
  }) async {
    final FileSystem fileSystem = exampleDirectory.fileSystem;
    String? resultBundlePath;
    final Directory? logsDirectory = ciLogsDirectory(hostPlatform, fileSystem);
    Directory? resultBundleTemp;
    try {
      if (logsDirectory != null) {
        resultBundleTemp = fileSystem.systemTempDirectory.createTempSync(
          'flutter_xcresult.',
        );
        resultBundlePath = resultBundleTemp.childDirectory('result').path;
      }
      File? disabledSandboxEntitlementFile;
      if (actions.contains('test') && targetPlatform.toLowerCase() == 'macos') {
        disabledSandboxEntitlementFile = _createDisabledSandboxEntitlementFile(
          exampleDirectory.childDirectory(targetPlatform.toLowerCase()),
          configuration ?? 'Debug',
        );
      }
      final args = <String>[
        _xcodeBuildCommand,
        ...actions,
        ...<String>['-workspace', workspace],
        ...<String>['-scheme', scheme],
        if (resultBundlePath != null) ...<String>[
          '-resultBundlePath',
          resultBundlePath,
        ],
        if (configuration != null) ...<String>['-configuration', configuration],
        ...extraFlags,
        if (disabledSandboxEntitlementFile != null)
          'CODE_SIGN_ENTITLEMENTS=${disabledSandboxEntitlementFile.path}',
      ];
      final completeTestCommand = '$_xcRunCommand ${args.join(' ')}';
      if (log) {
        print(completeTestCommand);
      }
      final int resultExit = await processRunner.runAndStream(
        _xcRunCommand,
        args,
        workingDir: exampleDirectory,
      );

      if (resultExit != 0 && resultBundleTemp != null) {
        final Directory xcresultBundle = resultBundleTemp.childDirectory(
          'result.xcresult',
        );
        if (logsDirectory != null) {
          if (xcresultBundle.existsSync()) {
            // Zip the test results to the artifacts directory for upload.
            final File zipPath = logsDirectory.childFile(
              'xcodebuild-${DateTime.now().toLocal().toIso8601String()}.zip',
            );
            await processRunner.run('zip', <String>[
              '-r',
              '-9',
              '-q',
              zipPath.path,
              xcresultBundle.basename,
            ], workingDir: resultBundleTemp);
          } else {
            print(
              'xcresult bundle ${xcresultBundle.path} does not exist, skipping upload',
            );
          }
        }
      }
      return resultExit;
    } finally {
      resultBundleTemp?.deleteSync(recursive: true);
    }
  }

  /// Returns true if [project], which should be an .xcodeproj directory,
  /// contains a target called [target], false if it does not, and null if the
  /// check fails (e.g., if [project] is not an Xcode project).
  Future<bool?> projectHasTarget(Directory project, String target) async {
    final io.ProcessResult result = await processRunner.run(
      _xcRunCommand,
      <String>[_xcodeBuildCommand, '-list', '-json', '-project', project.path],
    );
    if (result.exitCode != 0) {
      return null;
    }
    Map<String, dynamic>? projectInfo;
    try {
      projectInfo =
          (jsonDecode(result.stdout as String)
                  as Map<String, dynamic>)['project']
              as Map<String, dynamic>?;
    } on FormatException {
      return null;
    }
    if (projectInfo == null) {
      return null;
    }
    final List<String>? targets = (projectInfo['targets'] as List<dynamic>?)
        ?.cast<String>();
    return targets?.contains(target) ?? false;
  }

  /// Returns the newest available simulator (highest OS version, with ties
  /// broken in favor of newest device), if any.
  Future<String?> findBestAvailableIphoneSimulator() async {
    final findSimulatorsArguments = <String>[
      'simctl',
      'list',
      'devices',
      'runtimes',
      'available',
      '--json',
    ];
    final findSimulatorCompleteCommand =
        '$_xcRunCommand ${findSimulatorsArguments.join(' ')}';
    if (log) {
      print('Looking for available simulators...');
      print(findSimulatorCompleteCommand);
    }
    final io.ProcessResult findSimulatorsResult = await processRunner.run(
      _xcRunCommand,
      findSimulatorsArguments,
    );
    if (findSimulatorsResult.exitCode != 0) {
      if (log) {
        printError(
          'Error occurred while running "$findSimulatorCompleteCommand":\n'
          '${findSimulatorsResult.stderr}',
        );
      }
      return null;
    }
    final simulatorListJson =
        jsonDecode(findSimulatorsResult.stdout as String)
            as Map<String, dynamic>;
    final List<Map<String, dynamic>> runtimes =
        (simulatorListJson['runtimes'] as List<dynamic>)
            .cast<Map<String, dynamic>>();
    final Map<String, Object> devices =
        (simulatorListJson['devices'] as Map<String, dynamic>)
            .cast<String, Object>();
    if (runtimes.isEmpty || devices.isEmpty) {
      return null;
    }
    String? id;
    // Looking for runtimes, trying to find one with highest OS version.
    for (final Map<String, dynamic> rawRuntimeMap in runtimes.reversed) {
      final Map<String, Object> runtimeMap = rawRuntimeMap
          .cast<String, Object>();
      if ((runtimeMap['name'] as String?)?.contains('iOS') != true) {
        continue;
      }
      final runtimeID = runtimeMap['identifier'] as String?;
      if (runtimeID == null) {
        continue;
      }
      final List<Map<String, dynamic>>? devicesForRuntime =
          (devices[runtimeID] as List<dynamic>?)?.cast<Map<String, dynamic>>();
      if (devicesForRuntime == null || devicesForRuntime.isEmpty) {
        continue;
      }
      // Looking for runtimes, trying to find latest version of device.
      for (final Map<String, dynamic> rawDevice in devicesForRuntime.reversed) {
        final Map<String, Object> device = rawDevice.cast<String, Object>();
        id = device['udid'] as String?;
        if (id == null) {
          continue;
        }
        if (log) {
          print('device selected: $device');
        }
        return id;
      }
    }
    return null;
  }

  /// Finds and copies macOS entitlements file. In the copy, disables sandboxing.
  /// If entitlements file is not found, returns null.
  ///
  /// As of macOS 14, testing a macOS sandbox app may prompt the user to grant
  /// access to the app. To workaround this in CI, we create and use a entitlements
  /// file with sandboxing disabled. See
  /// https://developer.apple.com/documentation/security/app_sandbox/accessing_files_from_the_macos_app_sandbox.
  File? _createDisabledSandboxEntitlementFile(
    Directory macOSDirectory,
    String configuration,
  ) {
    final entitlementDefaultFileName = configuration == 'Release'
        ? 'Release'
        : 'DebugProfile';

    final File entitlementFile = macOSDirectory
        .childDirectory('Runner')
        .childFile('$entitlementDefaultFileName.entitlements');

    if (!entitlementFile.existsSync()) {
      print('Unable to find entitlements file at ${entitlementFile.path}');
      return null;
    }

    final String originalEntitlementFileContents = entitlementFile
        .readAsStringSync();
    final File disabledSandboxEntitlementFile = macOSDirectory
        .fileSystem
        .systemTempDirectory
        .createTempSync('flutter_disable_sandbox_entitlement.')
        .childFile(
          '${entitlementDefaultFileName}WithDisabledSandboxing.entitlements',
        );
    disabledSandboxEntitlementFile.createSync(recursive: true);
    disabledSandboxEntitlementFile.writeAsStringSync(
      originalEntitlementFileContents.replaceAll(
        RegExp(
          r'<key>com\.apple\.security\.app-sandbox<\/key>[\S\s]*?<true\/>',
        ),
        '''
<key>com.apple.security.app-sandbox</key>
	<false/>''',
      ),
    );

    return disabledSandboxEntitlementFile;
  }
}
