"""Python native TGZ creation."""

from __future__ import absolute_import, print_function

import tarfile
import os

from lib.util import (
    display,
)

# improve performance by disabling uid/gid lookups
tarfile.pwd = None
tarfile.grp = None

# To reduce archive time and size, ignore non-versioned files which are large or numerous.
# Also ignore miscellaneous git related files since the .git directory is ignored.

IGNORE_DIRS = (
    '.tox',
    '.git',
    '.idea',
    '__pycache__',
    'ansible.egg-info',
)

IGNORE_FILES = (
    '.gitignore',
    '.gitdir',
)

IGNORE_EXTENSIONS = (
    '.pyc',
    '.retry',
)


def ignore(item):
    """
    :type item: tarfile.TarInfo
    :rtype: tarfile.TarInfo | None
    """
    filename = os.path.basename(item.path)
    name, ext = os.path.splitext(filename)
    dirs = os.path.split(item.path)

    if not item.isdir():
        if item.path.startswith('./test/results/'):
            return None

        if item.path.startswith('./docs/docsite/_build/'):
            return None

    if name in IGNORE_FILES:
        return None

    if ext in IGNORE_EXTENSIONS:
        return None

    if any(d in IGNORE_DIRS for d in dirs):
        return None

    return item


def create_tarfile(dst_path, src_path, tar_filter):
    """
    :type dst_path: str
    :type src_path: str
    :type tar_filter: (tarfile.TarInfo) -> tarfile.TarInfo | None
    """
    display.info('Creating a compressed tar archive of path: %s' % src_path, verbosity=1)

    with tarfile.TarFile.gzopen(dst_path, mode='w', compresslevel=4) as tar:
        tar.add(src_path, filter=tar_filter)

    display.info('Resulting archive is %d bytes.' % os.path.getsize(dst_path), verbosity=1)