import boto3
from datetime import datetime
from threading import Thread, Semaphore
import logging
from botocore.config import Config

cw = boto3.client("cloudwatch", config=Config(region_name="us-east-1"))
sema = Semaphore(8)


def put_queue_wait_metric(queue_name, value):
    call_time = datetime.now()

    res = sema.acquire(blocking=False)
    if not res:
        logging.info("Not putting cloudwatch metric - too many threads")
        return

    def thunk():
        try:
            cw.put_metric_data(
                Namespace="composer",
                MetricData=[
                    {
                        "MetricName": "queue_wait_time",
                        "Dimensions": [{"Name": "queue_name", "Value": queue_name}],
                        "Timestamp": call_time,
                        "Value": value,
                        "Unit": "Seconds",
                    }
                ],
            )
        except Exception as e:
            logging.warning(f"Failed to put cloudwatch metric: {e}")
        finally:
            sema.release()

    Thread(target=thunk, daemon=True).start()
