import logging
import os

import ctypes
import ctypes.util

_LOGGER = logging.getLogger(__name__)

_LIBRARY_NAME = 'libarchive'
_LIBRARY_FILENAME = 'libarchive.so'

def find_and_load_library():
    search_filepaths = []

    # Search for the library using our own environment variable.

    filepath = os.environ.get('LA_LIBRARY_FILEPATH', '')
    if filepath != '':
        search_filepaths.append(filepath)

    # Search for the library using the well-defined system library search-path.

    _SEARCH_PATH = os.environ.get('LD_LIBRARY_PATH', '')
    if _SEARCH_PATH != '':
        for path in _SEARCH_PATH.split(":"):
            filepath = os.path.join(path, _LIBRARY_FILENAME)
            search_filepaths.append(filepath)

    # Search for our library using whatever search-path ctypes uses (not the same 
    # as `LD_LIBRARY_PATH`).

    filepath = ctypes.util.find_library(_LIBRARY_NAME)
    if filepath is not None:
        search_filepaths.append(filepath)

    # Load the first one available.

    found_filepath = None
    for filepath in search_filepaths:
        if os.path.exists(filepath) is True:
            return filepath

    # Fallback on the naively trying to load the filename.

    _LOGGER.debug("Using default library file-path: [%s]", _LIBRARY_FILENAME)
    return _LIBRARY_FILENAME

_FILEPATH = find_and_load_library()

_LOGGER.debug("Using library file-path: [%s]", _FILEPATH)
libarchive = ctypes.cdll.LoadLibrary(_FILEPATH)