from pathlib import Path

from common import exec_command, get_env_variable_required, is_semver, print_message
from src.interface.angular_project import AngularProjectInterface


class AngularLib(AngularProjectInterface):
    def __init__(self) -> None:
        super().__init__()

        self._package_name = self._get_package_json_attribute("name")

    def _build(self):
        prefix = self.package_json.parent

        exec_command(
            f"npm --no-git-tag-version version {self.version} --allow-same-version --prefix {prefix}",
            print_output=False,
        )

        super()._build()

    def package(self):
        npm_token = get_env_variable_required("NPM_TOKEN")
        source_folder_npm = get_env_variable_required("SOURCE_FOLDER_NPM")

        tag_npm = ""

        if not is_semver(self.version):
            pre_release_tag = "-".join(self.version.split("-")[1:][:-1])
            tag_npm = f"--tag {pre_release_tag}"

        if self.sci_deploy_cdn:
            self._package_to_cdn()

        npmrc_path = Path(".npmrc")
        npmrc_path.write_text(
            f"//registry.npmjs.org/:_authToken={npm_token}\n", encoding="utf-8"
        )

        exec_command("npm config set registry https://registry.npmjs.org/")

        exec_command(
            f"npm publish {source_folder_npm} --access public {tag_npm}",
            error_message="Erro ao publicar pacote npm. Cheque os logs acima para mais detalhes.",
        )

        print_message(
            f"Versão {self.version} da biblioteca {self._package_name} publicada com sucesso!"
        )

    def _get_package_json(self):
        package_json = Path("lib/package.json")

        if not package_json.is_file():
            package_json = Path(f"projects/{self.ci_project_name}/package.json")

        return package_json
