"""Convenience API for tkfilter."""

from __future__ import annotations

from typing import Any, Iterable

from .tkfiltermanager import tkFilterManager


def load_filters(
    plugin_dir: str = "filter",
    fmask: str = "*.py",
    sort: bool = True,
    manifest: str | None = None,
    order_file: str | None = None,
    include_unlisted: bool = False,
    is_print: bool = True,
    reload: bool = False,
) -> tkFilterManager:
    """Create a manager and load filters.

    ``manifest``/``order_file`` is a plain-text file listing module filenames or
    module names in priority order.  If omitted, ``plugin_dir/fmask`` is loaded
    in filename order.
    """

    manager = tkFilterManager(
        plugin_dir=plugin_dir,
        fmask=fmask,
        sort=sort,
        manifest=manifest,
        order_file=order_file,
        include_unlisted=include_unlisted,
    )
    manager.load_filters(is_print=is_print, reload=reload)
    return manager


def read_data(
    path: str,
    plugin_dir: str = "filter",
    fmask: str = "*.py",
    manifest: str | None = None,
    order_file: str | None = None,
    include_unlisted: bool = False,
    manager: tkFilterManager | None = None,
    app: Any = None,
    cparams: Any = None,
    convert: bool = True,
    is_print: bool = False,
    return_filter: bool = False,
    raise_error: bool = True,
) -> Any:
    """Read one file by loading filters and calling the matching read_data()."""

    if manager is None:
        manager = load_filters(
            plugin_dir=plugin_dir,
            fmask=fmask,
            manifest=manifest,
            order_file=order_file,
            include_unlisted=include_unlisted,
            is_print=is_print,
        )
    return manager.read_data(
        path,
        app=app,
        cparams=cparams,
        convert=convert,
        is_print=is_print,
        return_filter=return_filter,
        raise_error=raise_error,
    )


def read_files(
    paths: str | Iterable[str],
    plugin_dir: str = "filter",
    fmask: str = "*.py",
    manifest: str | None = None,
    order_file: str | None = None,
    include_unlisted: bool = False,
    manager: tkFilterManager | None = None,
    app: Any = None,
    cparams: Any = None,
    convert: bool = True,
    is_print: bool = False,
    raise_error: bool = False,
    skip_temporary: bool = True,
    skip_output: bool = True,
    return_filter: bool = False,
) -> list[Any]:
    """Read multiple files by loading filters and calling matching read_data()."""

    if manager is None:
        manager = load_filters(
            plugin_dir=plugin_dir,
            fmask=fmask,
            manifest=manifest,
            order_file=order_file,
            include_unlisted=include_unlisted,
            is_print=is_print,
        )
    return manager.read_files(
        paths,
        app=app,
        cparams=cparams,
        convert=convert,
        is_print=is_print,
        raise_error=raise_error,
        skip_temporary=skip_temporary,
        skip_output=skip_output,
        return_filter=return_filter,
    )
