"""JSON-line traces. Redact fields that should not leave the process."""

from __future__ import annotations

import json
import uuid

REDACT_KEYS = {"email", "authorization", "api_key", "password", "secret"}


def redact(value):
    if isinstance(value, dict):
        clean = {}
        for key, item in value.items():
            if key.lower() in REDACT_KEYS:
                clean[key] = "[redacted]"
            else:
                clean[key] = redact(item)
        return clean
    if isinstance(value, list):
        return [redact(item) for item in value]
    return value


class Tracer:
    def __init__(self, sink: list):
        self.trace_id = str(uuid.uuid4())
        self.sink = sink

    def span(self, name: str, fields: dict):
        self.sink.append(
            json.dumps(
                {"trace_id": self.trace_id, "span": name, **redact(fields)},
                sort_keys=True,
            )
        )

    def event(self, name: str, fields: dict):
        self.span(name, fields)
