import os
from actions_logging.app_logging import logger
import requests
from datetime import datetime
from datadog.constants import DATADOG_LOGS_URL, DEFAULT_HOSTNAME, DEFAULT_SERVICE, DEFAULT_SOURCE


def format_log_message(level, message, deploy_tag=''):
    """
    Format log message with level, message, and [deploy_tag] id needed
    :param level: INFO | ERROR | WARNING | DEBUG | CRITICAL
    :param message: the message to log
    :param deploy_tag: will be at the beggining of the message in square brackets
    :return: None
    """
    logger.debug(f"formatting log message with level: {level}, message: {message}, deploy_tag: {deploy_tag}")
    deploy_tag = f"[{deploy_tag}]" if deploy_tag else ""
    current_time = datetime.now().strftime('%Y-%m-%d %H:%M:%S,%f')[:-3]
    log_message = f'{level} {current_time} -{deploy_tag} {message}'
    logger.debug(f"formatted log message: {log_message}")
    return log_message


def create_dd_headers() -> dict:
    """
    Create datadog headers with the required DATADOG_API_KEY env var
    :return: headers dict with the api key
    """
    logger.debug("creating datadog headers with DATADOG_API_KEY required env var")
    datadog_api_key = os.getenv("GLOBAL_CICD_DATADOG_API_KEY")
    if not datadog_api_key:
        raise RuntimeError("GLOBAL_CICD_DATADOG_API_KEY env var is required to set up datadog headers")
    headers = {
        "Content-Type": "application/json",
        "DD-API-KEY": datadog_api_key
    }
    logger.debug("created datadog headers")
    return headers


def format_log_and_send_to_datadog(message, level='INFO', deploy_tag='', dd_source=DEFAULT_SOURCE, service=DEFAULT_SERVICE, hostname=DEFAULT_HOSTNAME):
    """
    Send log to datadog with message, level, deploy_tag, source, service, and hostname
    :param message: the raw message to became the log
    :param level: the log level: INFO | ERROR | WARNING | DEBUG | CRITICAL. default is INFO
    :param deploy_tag: the deploy tag to add to the log message. default is empty will add [deploy_tag] if not empty
    :param dd_source: the source of the log. default is release-app
    :param service: the service of the log. default is release-app
    :param hostname: the hostname of the log. default is github_action
    :return: None
    """
    try:
        logger.info(f"sending log to datadog with message: {message}, level: {level}, deploy_tag: {deploy_tag}, source: {dd_source}, service: {service}, hostname: {hostname}")
        log_message = format_log_message(level, message, deploy_tag)
        log_data = {
            "ddsource": dd_source,
            "service": service,
            "message": log_message,
            "hostname": hostname
        }
        logger.debug(f"log data to send to datadog: {log_data}")
        headers = create_dd_headers()
        logger.debug(f"sending log to datadog with created headers. headers keys: {headers.keys()}")
        response = requests.post(DATADOG_LOGS_URL, headers=headers, json=log_data)
        logger.debug(f"Response Code: {response.status_code}, Response: {response.text}")
        response.raise_for_status()
        logger.info(f"sent log to datadog with message: {log_message}")
    except requests.exceptions.HTTPError as http_err:
        logger.error(f'HTTP error occurred in send_log_to_datadog: {http_err}')
    except Exception as err:
        logger.error(f'Other error occurred in send_log_to_datadog: {err}')
