from aws_lambda_powertools import Logger, Tracer
from aws_lambda_powertools.utilities.data_classes import (
    DynamoDBStreamEvent,
    event_source,
)
from aws_lambda_powertools.utilities.typing import LambdaContext
from config import MEILISEARCH_API_KEY, MEILISEARCH_HOST
from meili import Op
from meilisearch import Client as Meilisearch
from utils import table_from_arn

logger = Logger(__name__)
tracer = Tracer()
meili_client = Meilisearch(MEILISEARCH_HOST, MEILISEARCH_API_KEY)


@event_source(data_class=DynamoDBStreamEvent)
@logger.inject_lambda_context
@tracer.capture_lambda_handler
def lambda_handler(event: DynamoDBStreamEvent, context: LambdaContext):
    with Op(meili_client) as op:
        for record in event.records:
            pk = record.dynamodb.keys['id']  # type: ignore
            new_image = sanitize(record.dynamodb.new_image)  # type: ignore
            index = table_from_arn(record.event_source_arn)  # type: ignore

            op.append(
                index,
                op=record.event_name,  # type: ignore
                data=new_image or pk,
            )


# Post-migration: remove the following function
def sanitize(obj):
    if isinstance(obj, dict):
        return {k.replace(':', '__'): sanitize(v) for k, v in obj.items()}
    elif isinstance(obj, list):
        return [sanitize(item) for item in obj]
    else:
        return obj
