# Licensed under a 3-clause BSD style license - see LICENSE.rst

from functools import wraps

import pytest

from astropy.utils.compat.optional_deps import HAS_PYTEST_MPL


def figure_test(*args, **kwargs):
    """
    A decorator that defines a figure test.

    This automatically decorates tests with mpl_image_compare with common
    options used by all figure tests in astropy, and also adds the decorator
    to allow remote data to be accessed.
    """

    # NOTE: the savefig_kwargs option below is to avoid using PNG files with
    # the matplotlib version embedded since this changes for every developer
    # version.

    tolerance = kwargs.pop("tolerance", 0)
    style = kwargs.pop("style", {})
    savefig_kwargs = kwargs.pop("savefig_kwargs", {})
    savefig_kwargs["metadata"] = {"Software": None}

    def decorator(test_function):
        @pytest.mark.remote_data
        @pytest.mark.mpl_image_compare(
            tolerance=tolerance, style=style, savefig_kwargs=savefig_kwargs, **kwargs
        )
        @pytest.mark.skipif(
            not HAS_PYTEST_MPL, reason="pytest-mpl is required for the figure tests"
        )
        @wraps(test_function)
        def test_wrapper(*args, **kwargs):
            return test_function(*args, **kwargs)

        return test_wrapper

    # If the decorator was used without any arguments, the only positional
    # argument will be the test to decorate so we do the following:
    if len(args) == 1:
        return decorator(*args)

    return decorator
