// 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 '../base/file_system.dart';
import '../base/project_migrator.dart';
import '../base/version.dart';
import '../ios/xcodeproj.dart';
import '../xcode_project.dart';

/// Starting in Xcode 15, when building macOS, DT_TOOLCHAIN_DIR cannot be used
/// to evaluate LD_RUNPATH_SEARCH_PATHS or LIBRARY_SEARCH_PATHS. `xcodebuild`
/// error message recommend using TOOLCHAIN_DIR instead.
///
/// This has been fixed upstream in CocoaPods, but migrate a copy of their
/// workaround so users don't need to update.
class CocoaPodsToolchainDirectoryMigration extends ProjectMigrator {
  CocoaPodsToolchainDirectoryMigration(
    XcodeBasedProject project,
    XcodeProjectInterpreter xcodeProjectInterpreter,
    super.logger,
  )   : _podRunnerTargetSupportFiles = project.podRunnerTargetSupportFiles,
        _xcodeProjectInterpreter = xcodeProjectInterpreter;

  final Directory _podRunnerTargetSupportFiles;
  final XcodeProjectInterpreter _xcodeProjectInterpreter;

  @override
  Future<void> migrate() async {
    if (!_podRunnerTargetSupportFiles.existsSync()) {
      logger.printTrace('CocoaPods Pods-Runner Target Support Files not found, skipping TOOLCHAIN_DIR workaround.');
      return;
    }

    final Version? version = _xcodeProjectInterpreter.version;

    // If Xcode not installed or less than 15, skip this migration.
    if (version == null || version < Version(15, 0, 0)) {
      logger.printTrace('Detected Xcode version is $version, below 15.0, skipping TOOLCHAIN_DIR workaround.');
      return;
    }

    final List<FileSystemEntity> files = _podRunnerTargetSupportFiles.listSync();
    for (final FileSystemEntity file in files) {
      if (file.basename.endsWith('xcconfig') && file is File) {
        processFileLines(file);
      }
    }
  }

  @override
  String? migrateLine(String line) {
    final String trimmedString = line.trim();
    if (trimmedString.startsWith('LD_RUNPATH_SEARCH_PATHS') || trimmedString.startsWith('LIBRARY_SEARCH_PATHS')) {
      const String originalReadLinkLine = r'{DT_TOOLCHAIN_DIR}';
      const String replacementReadLinkLine = r'{TOOLCHAIN_DIR}';

      return line.replaceAll(originalReadLinkLine, replacementReadLinkLine);
    }
    return line;
  }
}
