import os
import re

import requests

_slack_headers = {
    "Content-Type": "application/x-www-form-urlencoded",
}


def _make_data(channel, content, user, project_name, version, build_url, branch, build_name):
    data = f"""payload={{"channel": "#{channel}",
    "username": "TeamcityBot",
    "text": "<!here> {user} triggered a build from {branch} branch of project {project_name} with version {version} that failed",
    "icon_emoji": ":ghost:",
    "attachments":[{{
    "color":"#D00000",
    "fields":[{{
    "title":"{build_name} build failed",
    "value":"<{build_url}|link to teamcity>\\nerror message: \\n{content}",
    "short":false}}]}}]}}"""
    return data


def send_message(channel, content, user, project_name, version, build_url, branch, build_name):
    data = _make_data(channel, content, user, project_name, version, build_url, branch, build_name)
    response = requests.post(
        f"https://hooks.slack.com/services/T08TZ9AFP/BHE6WRLK1/{slack_token}", headers=_slack_headers, data=data
    )
    if response.status_code < 300:
        print(f"slack message return {response.status_code} status code")
        return True
    else:
        print(f"sending slack message to {channel} failed. return {response.status_code} with {response.text}")
        return False


if __name__ == "__main__":
    server = os.getenv("GITHUB_SERVER_URL")
    repo = os.getenv("GITHUB_REPOSITORY")
    run_id = os.getenv("GITHUB_RUN_ID")
    user = os.getenv("GITHUB_ACTOR")
    branch = os.getenv("GITHUB_REF")
    slack_token = os.getenv("GLOBAL_CICD_SLACK_TOKEN")
    channel = os.getenv("SLACK_CHANNEL")
    content = os.getenv("MESSAGE_OF_FAIL")
    content = re.sub("[^A-Za-z0-9 :/.-]+", "", content)
    print("########")
    print(content)
    print("########")
    if os.getenv("DIR_TO_BUILD"):
        project_name = os.getenv("DIR_TO_BUILD")
    else:
        project_name = repo.split("/", 1)
    version = os.getenv("VERSION_TO_DEPLOY")
    build_url = f"{server}/{repo}/actions/runs{run_id}"  # os.getenv('GLOBAL_CICD_SLACK_TOKEN')
    build_name = repo
    send_message(channel, content, user, project_name, version, build_url, branch, build_name)
