// 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 '../base/file_system.dart';
import '../globals_null_migrated.dart' as globals;

/// Manages a Font configuration that can be shared across multiple tests.
class FontConfigManager {
  Directory? _fontsDirectory;
  File? _cachedFontConfig;

  /// Returns a Font configuration that limits font fallback to the artifact
  /// cache directory.
  File get fontConfigFile {
    if (_cachedFontConfig != null) {
      return _cachedFontConfig!;
    }

    final StringBuffer sb = StringBuffer();
    sb.writeln('<fontconfig>');
    sb.writeln('  <dir>${globals.cache.getCacheArtifacts().path}</dir>');
    sb.writeln('  <cachedir>/var/cache/fontconfig</cachedir>');
    sb.writeln('</fontconfig>');

    if (_fontsDirectory == null) {
      _fontsDirectory = globals.fs.systemTempDirectory.createTempSync('flutter_test_fonts.');
      globals.printTrace('Using this directory for fonts configuration: ${_fontsDirectory!.path}');
    }

    _cachedFontConfig = globals.fs.file('${_fontsDirectory!.path}/fonts.conf');
    _cachedFontConfig!.createSync();
    _cachedFontConfig!.writeAsStringSync(sb.toString());
    return _cachedFontConfig!;
  }

  Future<void> dispose() async {
    if (_fontsDirectory != null) {
      globals.printTrace('Deleting ${_fontsDirectory!.path}...');
      await _fontsDirectory!.delete(recursive: true);
      _fontsDirectory = null;
    }
  }
}