# Copyright (c) 2017 Ansible Project
# GNU General Public License v3.0+ (see LICENSES/GPL-3.0-or-later.txt or https://www.gnu.org/licenses/gpl-3.0.txt)
# SPDX-License-Identifier: GPL-3.0-or-later

from __future__ import (absolute_import, division, print_function)
__metaclass__ = type

import json

import pytest

from ansible.module_utils.six import string_types
from ansible.module_utils.common.text.converters import to_bytes
from ansible.module_utils.common._collections_compat import MutableMapping

from ansible_collections.community.general.plugins.module_utils import deps


def fix_ansible_args(args):
    if isinstance(args, string_types):
        return args

    if isinstance(args, MutableMapping):
        if 'ANSIBLE_MODULE_ARGS' not in args:
            args = {'ANSIBLE_MODULE_ARGS': args}
        if '_ansible_remote_tmp' not in args['ANSIBLE_MODULE_ARGS']:
            args['ANSIBLE_MODULE_ARGS']['_ansible_remote_tmp'] = '/tmp'
        if '_ansible_keep_remote_files' not in args['ANSIBLE_MODULE_ARGS']:
            args['ANSIBLE_MODULE_ARGS']['_ansible_keep_remote_files'] = False
        args = json.dumps(args)
        return args

    else:
        raise Exception('Malformed data to the patch_ansible_module pytest fixture')


@pytest.fixture
def patch_ansible_module(request, mocker):
    if hasattr(request, "param"):
        args = fix_ansible_args(request.param)
        mocker.patch('ansible.module_utils.basic._ANSIBLE_ARGS', to_bytes(args))
    else:
        def _patch(args):
            args = fix_ansible_args(args)
            mocker.patch('ansible.module_utils.basic._ANSIBLE_ARGS', to_bytes(args))
        return _patch


@pytest.fixture(autouse=True)
def deps_cleanup():
    deps.clear()