@TestOn('vm')
import 'dart:async';
import 'dart:convert';
import 'dart:typed_data';

import 'package:tar/src/constants.dart';
import 'package:tar/src/exception.dart';
import 'package:tar/src/utils.dart';
import 'package:test/test.dart';

// ignore_for_file: avoid_js_rounded_ints
void main() {
  group('readString', () {
    test('can read empty strings', () {
      expect(_bytes('').readString(0, 0), '');
    });

    test('does not include trailing null', () {
      expect(_bytes('hello\x00').readString(0, 6), 'hello');
    });

    test('does not require a trailing null', () {
      expect(_bytes('hello').readString(0, 5), 'hello');
    });
  });

  group('readStringOrNullIfEmpty', () {
    test('returns null if empty', () {
      expect(_bytes('').readStringOrNullIfEmpty(0, 0), isNull);
    });

    test('can read non-empty strings', () {
      expect(_bytes('hello').readStringOrNullIfEmpty(0, 5), 'hello');
    });
  });

  group('generates stream of zeroes', () {
    const lengths = [024 * 1024 * 128 + 12, 12, 0];

    for (final length in lengths) {
      test('with length $length', () {
        final stream = zeroes(length);

        expect(
          stream.fold<int>(0, (previous, element) => previous + element.length),
          completion(length),
        );
      });
    }
  });

  group('readNumeric', () {
    void testValid(String value, int expected) {
      test('readNumeric($value)', () {
        expect(Uint8List.fromList(value.codeUnits).readNumeric(0, value.length),
            expected);
      });
    }

    void testValidBin(List<int> value, int expected) {
      test('readNumeric($value)', () {
        expect(
            Uint8List.fromList(value).readNumeric(0, value.length), expected);
      });
    }

    void testInvalid(String value) {
      test('readNumeric($value)', () {
        expect(() => _bytes(value).readNumeric(0, value.length),
            throwsA(isA<TarException>()));
      });
    }

    group('base-256', () {
      testValidBin([0x0], 0);
      testValidBin([0x80], 0);
      testValidBin([0x80, 0x00], 0);
      testValidBin([0x80, 0x00, 0x00], 0);
      testValidBin([0xbf], (1 << 6) - 1);
      testValidBin([0xbf, 0xff], (1 << 14) - 1);
      testValid('\xbf\xff\xff', (1 << 22) - 1);
      testValidBin([0xff], -1);
      testValidBin([0xff, 0xff], -1);
      testValidBin([0xff, 0xff, 0xff], -1);
      testValid('\xc0', -1 * (1 << 6));
      testValid('\xc0\x00', -1 * (1 << 14));
      testValid('\xc0\x00\x00', -1 * (1 << 22));
      testValid('\x87\x76\xa2\x22\xeb\x8a\x72\x61', 537795476381659745);
      testValid('\x80\x00\x00\x00\x07\x76\xa2\x22\xeb\x8a\x72\x61',
          537795476381659745);
      testValid('\xf7\x76\xa2\x22\xeb\x8a\x72\x61', -615126028225187231);
      testValid('\xff\xff\xff\xff\xf7\x76\xa2\x22\xeb\x8a\x72\x61',
          -615126028225187231);
      testValid('\x80\x7f\xff\xff\xff\xff\xff\xff\xff', 9223372036854775807);
      testValid('\xff\x80\x00\x00\x00\x00\x00\x00\x00', -9223372036854775808);
    });

    group('octal', () {
      testValid('', 0);
      testValid('   \x00  ', 0);
      testValid('0000000\x00', 0);
      testValid(' \x0000000\x00', 0);
      testValid(' \x0000003\x00', 3);
      testValid('00000000644\x00', 420);
      testValid('032033\x00 ', 13339);
      testValid('320330\x00 ', 106712);
      testValid('0000660\x00 ', 432);
      testValid('\x00 0000660\x00 ', 432);

      testInvalid('0123456789abcdef');
      testInvalid('0123456789\x00abcdef');
      testInvalid('0123\x7e\x5f\x264123');
    });
  });

  group('parsePaxTime', () {
    const validTimes = {
      '1350244992.023960108': 1350244992023960,
      '1350244992.02396010': 1350244992023960,
      '1350244992.0239601089': 1350244992023960,
      '1350244992.3': 1350244992300000,
      '1350244992': 1350244992000000,
      '-1.000000001': -1000000,
      '-1.000001': -1000001,
      '-1.001000': -1001000,
      '-1': -1000000,
      '-1.999000': -1999000,
      '-1.999999': -1999999,
      '-1.999999999': -1999999,
      '0.000000001': 0,
      '0.000001': 1,
      '0.001000': 1000,
      '0': 0,
      '0.999000': 999000,
      '0.999999': 999999,
      '0.999999999': 999999,
      '1.000000001': 1000000,
      '1.000001': 1000001,
      '1.001000': 1001000,
      '1': 1000000,
      '1.999000': 1999000,
      '1.999999': 1999999,
      '1.999999999': 1999999,
      '-1350244992.023960108': -1350244992023960,
      '-1350244992.02396010': -1350244992023960,
      '-1350244992.0239601089': -1350244992023960,
      '-1350244992.3': -1350244992300000,
      '-1350244992': -1350244992000000,
      '1.': 1000000,
      '0.0': 0,
      '-1.': -1000000,
      '-1.0': -1000000,
      '-0.0': 0,
      '-0.1': -100000,
      '-0.01': -10000,
      '-0.99': -990000,
      '-0.98': -980000,
      '-1.1': -1100000,
      '-1.01': -1010000,
      '-2.99': -2990000,
      '-5.98': -5980000,
    };

    validTimes.forEach((str, micros) {
      test('parsePaxTime($str)', () {
        expect(parsePaxTime(str), microsecondsSinceEpoch(micros));
      });
    });

    const invalidTimes = {
      '',
      '.5',
      '-',
      '+',
      '-1.-1',
      '99999999999999999999999999999999999999999999999',
      '0.123456789abcdef',
      'foo',
      '𝟵𝟴𝟳𝟲𝟱.𝟰𝟯𝟮𝟭𝟬', // Unicode numbers (U+1D7EC to U+1D7F5)
      '98765﹒43210', // Unicode period (U+FE52);
    };

    for (final invalid in invalidTimes) {
      test('parsePaxTime($invalid)', () {
        expect(() => parsePaxTime(invalid), throwsA(isA<TarException>()));
      });
    }
  });

  group('BlockReader', () {
    late StreamController<List<int>> controller;

    setUp(() {
      controller = StreamController();
    });

    test('does not attach listener before needed', () async {
      final reader = BlockReader(controller.stream);
      expect(controller.hasListener, isFalse);

      final stream = reader.nextBlocks(10);
      expect(controller.hasListener, isFalse);

      stream.listen(null);
      // Should not attach synchronously
      expect(controller.hasListener, isFalse);

      await pumpEventQueue(times: 1);
      expect(controller.hasListener, isTrue);
    });

    test('emits individual blocks', () async {
      for (var i = 0; i < 10; i++) {
        controller.add(Uint8List(blockSize)..fillRange(0, blockSize, i));
      }

      final reader = BlockReader(controller.stream);

      for (var i = 0; i < 10; i++) {
        expect((await reader.nextBlock()).first, i);
      }
      await reader.close();
    });

    test('combines multiple chunks into a block', () async {
      controller
        ..add(Uint8List(blockSize - 10))
        ..add(Uint8List(blockSize + 20)..fillRange(0, blockSize + 10, 1));

      final reader = BlockReader(controller.stream);
      final firstBlock = await reader.nextBlock();

      expect(firstBlock[0], 0);
      expect(firstBlock[511], 1);

      final secondBlock = await reader.nextBlock();
      expect(secondBlock[0], 1);
      expect(secondBlock[511], 1);

      controller.close(); // ignore: unawaited_futures
      final thirdBlock = await reader.nextBlock();
      expect(thirdBlock.length, 10);

      expect(controller.hasListener, isFalse);
      await reader.close();
    });

    test('can pause and resume from saved chunk', () async {
      controller
        ..add(Uint8List(blockSize - 10))
        ..add(Uint8List(2 * blockSize + 10)..fillRange(0, blockSize + 10, 1));

      final reader = BlockReader(controller.stream);
      // ignore: cancel_subscriptions
      final subscription = reader.nextBlocks(3).listen(null);
      var eventCounter = 0;

      subscription.onData(expectAsync1((data) {
        eventCounter += data.length ~/ blockSize;

        // After the first block completed, we will trailing data. Ensure that
        // resuming in this state works!
        if (eventCounter == 1) {
          subscription.pause(Future.delayed(Duration.zero));
        }
      }, max: 3));

      await subscription.asFuture<void>();
      expect(eventCounter, 3);
      await reader.close();
    });

    test('can cancel subscriptions', () async {
      controller
        ..add(Uint8List(blockSize))
        ..add(Uint8List(blockSize));

      final reader = BlockReader(controller.stream);
      await reader.nextBlocks(2).first;
      await reader.close();
    });
  });
}

Uint8List _bytes(String str) {
  return Uint8List.fromList(utf8.encode(str));
}
