import datetime
from collections import defaultdict

# Placeholder for actual data retrieval (replace with database access)
_trigger_counts = {}

def record_trigger(trigger_id, timestamp=None):
    if timestamp is None:
        timestamp = datetime.datetime.utcnow()
    if trigger_id not in _trigger_counts:
        _trigger_counts[trigger_id] = []
    _trigger_counts[trigger_id].append(timestamp)


def get_aggregated_trigger_counts(interval='daily'):
    """Aggregates trigger counts based on the specified time interval.

    Args:
        interval (str):  'hourly', 'daily', or 'weekly'.

    Returns:
        dict: A dictionary where keys are time intervals (datetime objects) and values are dictionaries
              mapping trigger IDs to their counts within that interval.
    """
    aggregated_counts = defaultdict(lambda: defaultdict(int))
    now = datetime.datetime.utcnow()

    for trigger_id, timestamps in _trigger_counts.items():
        for timestamp in timestamps:
            if interval == 'hourly':
                interval_key = datetime.datetime(timestamp.year, timestamp.month, timestamp.day, timestamp.hour)
            elif interval == 'daily':
                interval_key = datetime.datetime(timestamp.year, timestamp.month, timestamp.day)
            elif interval == 'weekly':
                # Calculate the start of the week (Monday)
                iso_calendar = timestamp.isocalendar()
                year, week_number, _ = iso_calendar
                # Find the first day of the week
                interval_key = datetime.datetime.fromisoformat(f'{year}-W{week_number:02}-1').date()
                interval_key = datetime.datetime.combine(interval_key, datetime.time.min) # convert to datetime

            else:
                raise ValueError("Invalid interval specified. Must be 'hourly', 'daily', or 'weekly'.")

            aggregated_counts[interval_key][trigger_id] += 1

    return aggregated_counts


if __name__ == '__main__':
    # Example Usage (replace with actual data and API calls)
    record_trigger('trigger_A')
    record_trigger('trigger_B')    
    record_trigger('trigger_A', datetime.datetime.utcnow() - datetime.timedelta(hours=3))
    record_trigger('trigger_C', datetime.datetime.utcnow() - datetime.timedelta(days=1))

    hourly_counts = get_aggregated_trigger_counts('hourly')
    daily_counts = get_aggregated_trigger_counts('daily')
    weekly_counts = get_aggregated_trigger_counts('weekly')

    print("Hourly Counts:", hourly_counts)
    print("Daily Counts:", daily_counts)
    print("Weekly Counts:", weekly_counts)