import os
from actions_logging.app_logging import logger
import argparse
from github.env import exit_on_error_and_write_summary, write_github_env
import subprocess
from utils import compute_sha256


def generate_build_command(build_os, build_tags):
    # Generate the build command based on the OS
    basic_build_commands = ["go", "build", "-ldflags=-s -w", f"-tags={build_tags}"]
    build_flags_and_directory = ["-buildmode=c-shared", "./attachment-agent/"]
    build_os = build_os.lower()
    if build_os == "windows":
        return basic_build_commands + ["-o", f"attachment-agent\\build\\firefly.dll" ] + build_flags_and_directory
    elif build_os == "linux":
        return basic_build_commands + ["-o", f"attachment-agent/build/firefly.so", "-buildvcs=false"] + build_flags_and_directory
    elif build_os == "macos":
        return basic_build_commands + ["-o", f"attachment-agent/build/firefly.dylib"] + build_flags_and_directory
    else:
        logger.error(f"Invalid OS specified: {build_os}")
        exit_on_error_and_write_summary(f"Invalid OS specified: {build_os}")

def build_go_project(build_os, build_tags=False):
    try:
        command = generate_build_command(build_os, build_tags=build_tags)
        logger.info(f"Build command: {command}")
        result = subprocess.run(command, check=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE, text=True)
        logger.info_green(f"Build Output: {result.stdout}")
        logger.warning(f"Build Errors: {result.stderr}")
    except subprocess.CalledProcessError as e:
        exit_on_error_and_write_summary(f"An error occurred while building the Go project: {e.stdout, e.stderr}")


def generate_file_path(build_os):
    build_os = build_os.lower()
    if build_os == "windows":
        return f"attachment-agent\\build\\firefly.dll"
    elif build_os == "linux":
        return f"attachment-agent/build/firefly.so"
    elif build_os == "macos":
        return f"attachment-agent/build/firefly.dylib"
    else:
        logger.error(f"Invalid OS specified: {build_os}")
        exit_on_error_and_write_summary(f"Invalid OS specified: {build_os}")


if __name__ == "__main__":
    # Parse command-line arguments
    parser = argparse.ArgumentParser(description="Get input parameters")
    parser.add_argument('--build_os', type=str, nargs='?', help='For which OS to create build for')
    parser.add_argument('--build_tags', type=str, nargs='?', help='Build tags to use during build')
    args = parser.parse_args()

    file_path = generate_file_path(args.build_os)
    build_go_project(args.build_os, args.build_tags)
    hash = compute_sha256(file_path)
    if hash is None or hash == "":
        exit_on_error_and_write_summary(f"Failed to compute hash for {file_path}")
    write_github_env(hash, "HASH")