import os

from actions_logging.app_logging import logger
from common.common import raise_with_context
from github.env import exit_on_error_and_write_summary, get_required_env_var, write_github_summary
from slack_wrapper.slack_notifier import SlackNotifier
from teamcity_apis.apis import trigger_teamcity_build
from teamcity_apis.constants import AUTOMATION_SMALL_MACHINES_BUILD_ID, TEAMCITY_URL


def get_tc_build_parameters(prefix="TC_PARAM_") -> dict:
    """Get tc build parameters from environment variables."""
    try:
        params = {}
        for key, value in os.environ.items():
            if key.startswith(prefix):
                param_name = key.split(prefix, 1)[1].replace("__", ".")
                params[param_name] = value
        return params
    except Exception as e:
        raise_with_context(e)


def main():
    try:
        # Set up environment variables for Slack notification
        os.environ["SLACK_CHANNEL"] = "suite_tests"
        os.environ["SLACK_USERNAME"] = "Reset Button Action"
        os.environ["SLACK_TITLE"] = "Reset Button Action"

        logger.info("getting tc build parameters")
        env_name = get_required_env_var("ENV_NAME")
        # shorten env name to 5 chars if it's longer than 7
        env_name_short = env_name[:5] if len(env_name) > 7 else env_name
        tenant_name = os.getenv("TENANT_NAME") or f"devopsteststenant-{env_name_short}"
        tenant_mail = os.getenv("TENANT_EMAIL") or f"dl-sase-devops-automation+{env_name}@checkpoint.com"
        mongo_uri = get_required_env_var(f"ENV_{env_name.upper()}_DATABASE_URI")

        os.environ["TC_PARAM_A__5__0_TENANT_HOST"] = f"{tenant_name}.p81-{env_name}.com"
        os.environ["TC_PARAM_A__4__0_TENANT_EMAIL"] = tenant_mail
        os.environ["TC_PARAM_DATABASE_URI"] = mongo_uri

        build_parameters = get_tc_build_parameters()

        logger.info(f"tc build parameters: {build_parameters}")

        build_parameters_markdown = "\n".join([f"- {k}: {v}" for k, v in build_parameters.items()])
        write_github_summary(f"Triggering TeamCity with these build parameters:\n{build_parameters_markdown}")
        logger.info(
            f"triggering TeamCity job called {AUTOMATION_SMALL_MACHINES_BUILD_ID}.\n"
            f"link to job: {TEAMCITY_URL}/buildConfiguration/{AUTOMATION_SMALL_MACHINES_BUILD_ID}",
        )
        logger.info("Starting TeamCity build trigger script.")
        build_id = trigger_teamcity_build(build_parameters, AUTOMATION_SMALL_MACHINES_BUILD_ID)
        if build_id is not None:
            build_url = f"{TEAMCITY_URL}/buildConfiguration/{AUTOMATION_SMALL_MACHINES_BUILD_ID}/{build_id}"
            logger.info_green(f"Build URL: {build_url}")
            write_github_summary(f" triggered tests successfully\n👉Build URL: {build_url}")
            logger.info_green("send slack message")
            message = f" triggered tests successfully\n👉Build URL: {build_url}"
            os.environ["SLACK_STATUS"] = "good"
        else:
            logger.warning("Build ID is None. Build may not have been triggered successfully.")
            logger.warning(
                "check in here if the build was triggered successfully: "
                f"{TEAMCITY_URL}/buildConfiguration/{AUTOMATION_SMALL_MACHINES_BUILD_ID}"
            )
            write_github_summary(
                "❌ Build ID is None. Build may not have been triggered successfully.\n"
                f"Check in here if the build was triggered successfully: "
                f"{TEAMCITY_URL}/buildConfiguration/{AUTOMATION_SMALL_MACHINES_BUILD_ID}"
            )
            message = (
                "❌ Build ID is None. Build may not have been triggered successfully.\n"
                f"Check in here if the build was triggered successfully: "
                f"{TEAMCITY_URL}/buildConfiguration/{AUTOMATION_SMALL_MACHINES_BUILD_ID}"
            )
            os.environ["SLACK_STATUS"] = "warning"
        os.environ["SLACK_MESSAGE"] = message
        slack = SlackNotifier()
        payload = slack.build_payload()
        slack.send_message(payload)

    except Exception as e:
        exit_on_error_and_write_summary(f"Failed to trigger TeamCity build: {e}")


if __name__ == "__main__":
    main()
