"""Common utilities for Brotli tests."""

import glob
import os
import pathlib
import sys
import sysconfig

project_dir = str(pathlib.PurePath(__file__).parent.parent.parent)
runtime_dir = os.getenv('TEST_SRCDIR')
test_dir = os.getenv('BROTLI_TESTS_PATH')

# Fallbacks
if test_dir and runtime_dir:
  test_dir = os.path.join(runtime_dir, test_dir)
elif test_dir is None:
  test_dir = os.path.join(project_dir, 'tests')

# Get the platform/version-specific build folder.
# By default, the distutils build base is in the same location as setup.py.
platform = sysconfig.get_platform()
version = sys.version_info
platform_lib_name = f'lib.{platform}-{version[0]}.{version[1]}'
build_dir = os.path.join(project_dir, 'bin', platform_lib_name)

# Prepend the build folder to sys.path and the PYTHONPATH environment variable.
if build_dir not in sys.path:
  sys.path.insert(0, build_dir)
TEST_ENV = dict(os.environ)
if 'PYTHONPATH' not in TEST_ENV:
  TEST_ENV['PYTHONPATH'] = build_dir
else:
  TEST_ENV['PYTHONPATH'] = build_dir + os.pathsep + TEST_ENV['PYTHONPATH']

TESTDATA_DIR = os.path.join(test_dir, 'testdata')


def gather_text_inputs():
  """Discover inputs for decompression tests."""
  all_inputs = [
      'empty',  # Empty file
      '10x10y',  # Small text
      'alice29.txt',  # Large text
      'random_org_10k.bin',  # Small data
      'mapsdatazrh',  # Large data
      'ukkonooa',  # Poem
      'cp1251-utf16le',  # Codepage 1251 table saved in UTF16-LE encoding
      'cp852-utf8',  # Codepage 852 table saved in UTF8 encoding
      # TODO(eustas): add test on already compressed content
  ]
  # Filter out non-existing files; e.g. in lightweight sources pack.
  return [
      f for f in all_inputs if os.path.isfile(os.path.join(TESTDATA_DIR, f))
  ]


def gather_compressed_inputs():
  """Discover inputs for compression tests."""
  candidates = glob.glob(os.path.join(TESTDATA_DIR, '*.compressed'))
  pairs = [(f, f.split('.compressed')[0]) for f in candidates]
  existing = [
      pair
      for pair in pairs
      if os.path.isfile(pair[0]) and os.path.isfile(pair[1])
  ]
  return [
      (os.path.basename(pair[0]), (os.path.basename(pair[1])))
      for pair in existing
  ]


def take_input(input_name):
  with open(os.path.join(TESTDATA_DIR, input_name), 'rb') as f:
    return f.read()


def has_input(input_name):
  return os.path.isfile(os.path.join(TESTDATA_DIR, input_name))


def chunk_input(data, chunk_size):
  return [data[i:i + chunk_size] for i in range(0, len(data), chunk_size)]
