"""
Python Runtime Validation
"""

import logging
import os
import subprocess

from aws_lambda_builders.exceptions import MisMatchRuntimeError
from aws_lambda_builders.validator import RuntimeValidator

from .utils import OSUtils

LOG = logging.getLogger(__name__)


class PythonRuntimeValidator(RuntimeValidator):
    def __init__(self, runtime, architecture):
        super(PythonRuntimeValidator, self).__init__(runtime, architecture)
        self.language = "python"
        self._valid_runtime_path = None

    def validate(self, runtime_path):
        """
        Checks if the language supplied matches the required lambda runtime

        Parameters
        ----------
        runtime_path : str
            runtime to check eg: /usr/bin/go

        Returns
        -------
        str
            runtime_path, runtime to check eg: /usr/bin/python3.9

        Raises
        ------
        MisMatchRuntimeError
            Raise runtime is not support or runtime does not support architecture.
        """

        runtime_path = super(PythonRuntimeValidator, self).validate(runtime_path)

        cmd = self._validate_python_cmd(runtime_path)

        p = subprocess.Popen(
            cmd, cwd=os.getcwd(), stdout=subprocess.PIPE, stderr=subprocess.PIPE, env=OSUtils().original_environ()
        )
        p.communicate()
        if p.returncode != 0:
            raise MisMatchRuntimeError(language=self.language, required_runtime=self.runtime, runtime_path=runtime_path)
        else:
            self._valid_runtime_path = runtime_path
            return self._valid_runtime_path

    def _validate_python_cmd(self, runtime_path):
        major, minor = self.runtime.replace(self.language, "").split(".")
        cmd = [
            runtime_path,
            "-c",
            "import sys; "
            "assert sys.version_info.major == {major} "
            "and sys.version_info.minor == {minor}".format(major=major, minor=minor),
        ]
        return cmd

    @property
    def validated_runtime_path(self):
        return self._valid_runtime_path
