"""
Wrapper around calls to Maven through a subprocess.
"""

import logging
import subprocess

from aws_lambda_builders.utils import decode

LOG = logging.getLogger(__name__)


class MavenExecutionError(Exception):
    MESSAGE = "Maven Failed: {message}"

    def __init__(self, **kwargs):
        Exception.__init__(self, self.MESSAGE.format(**kwargs))


class SubprocessMaven(object):
    def __init__(self, maven_binary, os_utils=None):
        if maven_binary is None:
            raise ValueError("Must provide Maven BinaryPath")
        self.maven_binary = maven_binary
        if os_utils is None:
            raise ValueError("Must provide OSUtils")
        self.os_utils = os_utils

    def build(self, scratch_dir):
        args = ["clean", "install"]
        ret_code, stdout, _ = self._run(args, scratch_dir)

        LOG.debug("Maven logs: %s", decode(stdout))

        if ret_code != 0:
            raise MavenExecutionError(message=decode(stdout))

    def copy_dependency(self, scratch_dir):
        include_scope = "runtime"
        LOG.debug("Running copy_dependency with scope: %s", include_scope)
        args = ["dependency:copy-dependencies", f"-DincludeScope={include_scope}", "-Dmdep.prependGroupId=true"]
        ret_code, stdout, _ = self._run(args, scratch_dir)

        if ret_code != 0:
            raise MavenExecutionError(message=decode(stdout))

    def _run(self, args, cwd=None):
        p = self.os_utils.popen(
            [self.maven_binary.binary_path] + args, cwd=cwd, stdout=subprocess.PIPE, stderr=subprocess.PIPE
        )
        stdout, stderr = p.communicate()
        return p.returncode, stdout, stderr
