# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.

import errno
import os
import shutil

import mozpack.path as mozpath
from buildconfig import topsrcdir
from mach.logging import LoggingManager

from mozbuild.util import ReadOnlyDict

# By including this module, tests get structured logging.
log_manager = LoggingManager()
log_manager.add_terminal_logging()


def prepare_tmp_topsrcdir(path):
    for p in (
        "build/autoconf/config.guess",
        "build/autoconf/config.sub",
        "build/moz.configure/checks.configure",
        "build/moz.configure/init.configure",
        "build/moz.configure/util.configure",
    ):
        file_path = os.path.join(path, p)
        try:
            os.makedirs(os.path.dirname(file_path))
        except OSError as e:
            if e.errno != errno.EEXIST:
                raise
        shutil.copy(os.path.join(topsrcdir, p), file_path)


# mozconfig is not a reusable type (it's actually a module) so, we
# have to mock it.
class MockConfig(object):
    def __init__(
        self,
        topsrcdir="/path/to/topsrcdir",
        extra_substs={},
        error_is_fatal=True,
    ):
        self.topsrcdir = mozpath.abspath(topsrcdir)
        self.topobjdir = mozpath.abspath("/path/to/topobjdir")

        self.substs = ReadOnlyDict(
            {
                "MOZ_FOO": "foo",
                "MOZ_BAR": "bar",
                "MOZ_TRUE": "1",
                "MOZ_FALSE": "",
                "DLL_PREFIX": "lib",
                "DLL_SUFFIX": ".so",
            },
            **extra_substs
        )

        self.defines = self.substs

        self.lib_prefix = "lib"
        self.lib_suffix = ".a"
        self.import_prefix = "lib"
        self.import_suffix = ".so"
        self.dll_prefix = "lib"
        self.dll_suffix = ".so"
        self.error_is_fatal = error_is_fatal
