import os
import sys

from actions_logging.app_logging import logger


def halt_or_continue_on_error(message, halt):
    if halt:
        exit_on_error_and_write_summary(message)
    logger.warning(message)
    sys.exit(0)


def exit_on_error_and_write_summary(summary):
    logger.error(summary)
    write_github_summary(f":stop_sign: {summary}")
    sys.exit(1)


def write_github_env(data, var_name):
    logger.debug(f"Writing {data} as {var_name} to GITHUB_ENV")
    write_github_data("GITHUB_ENV", data, var_name)


def write_github_output(data, var_name):
    logger.debug(f"Writing {data} as {var_name} to GITHUB_OUTPUT")
    write_github_data("GITHUB_OUTPUT", data, var_name)


def write_github_summary(data):
    logger.debug(f"Writing {data} to GITHUB_STEP_SUMMARY")
    write_github_data("GITHUB_STEP_SUMMARY", data)


def write_github_data(data_file_name, data, var_name=None):
    """
    Write data to a GitHub Actions environment file.

    This function writes the specified data to the GitHub Actions environment file specified by the
    environment variable `data_file_name`. If `var_name` is provided, the data is written as a key-value pair.
    If the data contains newline characters and `var_name` is provided, the data is written using the EOF format.

    Args:
        data_file_name (str): The name of the environment variable that contains the file path.
        data (str): The data to be written to the file.
        var_name (str, optional): The variable name to be used for the key-value pair. Defaults to None.

    Raises:
        SystemExit: If an error occurs while writing to the file.

    Example:
        >>> write_github_data('GITHUB_ENV', 'some_value', 'MY_VAR')
    """
    try:
        with open(os.getenv(data_file_name), "a") as gh_file_descriptor:
            str_data = str(data)
            if not var_name:
                gh_file_descriptor.write(f"{str_data}\n")
            elif "\n" in str_data:
                gh_file_descriptor.write(f"{var_name}<<EOF\n{str_data}\nEOF\n")
            else:
                gh_file_descriptor.write(f"{var_name}={str_data}\n")
    except Exception as e:
        logger.error(f"couldn't write to {data_file_name} due to error {e}")
        sys.exit(1)


def parse_bool_env_var(env_var):
    if env_var in ["false", "False", False]:
        return False
    elif env_var in ["true", "True", True]:
        return True
    else:
        exit_on_error_and_write_summary(f"Cannot cast {env_var} to boolean")


def get_required_env_var(env_var, message=""):
    var = os.getenv(env_var)
    if not var:
        error_message = message if message else f"Environment variable {env_var} not provided, halting"
        exit_on_error_and_write_summary(error_message)
    return var


def bool_to_gh_str(var: bool) -> str:
    return str(var).lower()
