// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
// for details. 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 'dart:io';

import 'package:path/path.dart' as path;
import 'package:pub/src/io.dart';
import 'package:pub/src/log.dart' as log;
import 'package:test_descriptor/test_descriptor.dart';

/// Describes a tar file and its contents.
class TarFileDescriptor extends FileDescriptor {
  final List<Descriptor> contents;

  TarFileDescriptor(String name, Iterable<Descriptor> contents)
      : contents = contents.toList(),
        super.protected(name);

  /// Creates the files and directories within this tar file, then archives
  /// them, compresses them, and saves the result to [parentDir].
  @override
  Future create([String? parent]) {
    return withTempDir((tempDir) async {
      await Future.wait(contents.map((entry) => entry.create(tempDir)));

      var createdContents = listDir(
        tempDir,
        recursive: true,
        includeHidden: true,
        includeDirs: false,
      );
      var bytes =
          await createTarGz(createdContents, baseDir: tempDir).toBytes();

      var file = path.join(parent ?? sandbox, name);
      _writeBinaryFile(file, bytes);
      return file;
    });
  }

  /// Validates that the `.tar.gz` file at [path] contains the expected
  /// contents.
  @override
  Future validate([String? parent]) {
    throw UnimplementedError('TODO(nweiz): implement this');
  }

  @override
  Future<String> read() =>
      throw UnsupportedError('TarFileDescriptor.read() is not supported.');

  @override
  Stream<List<int>> readAsBytes() {
    return Stream<List<int>>.fromFuture(
      withTempDir((tempDir) async {
        await create(tempDir);
        return readBinaryFile(path.join(tempDir, name));
      }),
    );
  }
}

/// Creates [file] and writes [contents] to it.
String _writeBinaryFile(String file, List<int> contents) {
  log.io('Writing ${contents.length} bytes to binary file $file.');
  deleteIfLink(file);
  File(file).openSync(mode: FileMode.write)
    ..writeFromSync(contents)
    ..closeSync();
  log.fine('Wrote text file $file.');
  return file;
}
