"""Extension module to create customizations"""

import importlib
import importlib.util
import sys
from pathlib import Path

sys.path.append("./senior-ci")

from . import print_message


class Extensions:
    def __init__(
        self,
    ):
        senior_ci_extensions_file = Path(".senior_ci_extensions.py")

        self.senior_ci_extensions = None
        if senior_ci_extensions_file.is_file():
            print_message("Carregando arquivo de extensões - .senior_ci_extensions.py")

            spec = importlib.util.spec_from_file_location(
                "senior_ci_extensions", senior_ci_extensions_file
            )
            self.senior_ci_extensions = importlib.util.module_from_spec(spec)
            spec.loader.exec_module(self.senior_ci_extensions)

        else:
            print_message(
                "Arquivo de extensões não encontrado (.senior_ci_extensions.py). Continuando execução padrão do CI."
            )

    def before_build(self):
        self._exec_hook("before_build")

    def after_build(self):
        self._exec_hook("after_build")

    def before_release_snapshot(self):
        self._exec_hook("before_release_snapshot")

    def after_release_snapshot(self):
        self._exec_hook("after_release_snapshot")

    def before_release(self):
        self._exec_hook("before_release")

    def after_release(self):
        self._exec_hook("after_release")

    def before_change_changelog(self):
        self._exec_hook("before_change_changelog")

    def after_change_changelog(self):
        self._exec_hook("after_change_changelog")

    def before_packaging(self):
        self._exec_hook("before_packaging")

    def after_packaging(self):
        self._exec_hook("after_packaging")

    def before_deploy(self):
        self._exec_hook("before_deploy")

    def after_deploy(self):
        self._exec_hook("after_deploy")

    def before_deploy_external(self):
        self._exec_hook("before_deploy_external")

    def after_deploy_external(self):
        self._exec_hook("after_deploy_external")

    def before_sonar(self):
        self._exec_hook("before_sonar")

    def after_sonar(self):
        self._exec_hook("after_sonar")

    def _exec_hook(self, hook):
        if self.senior_ci_extensions and hasattr(self.senior_ci_extensions, hook):
            print_message(f"Disparando hook {hook} do .senior_ci_extensions.py")
            hook = getattr(self.senior_ci_extensions, hook)
            hook()

        self.do_nothing()

    @staticmethod
    def do_nothing():
        """Method for when the hook was not found"""
