"""Event definitions for the subscriptions domain."""

from typing import List, Dict

SUBSCRIPTION_EVENTS: List[Dict] = [
    {
        "event_id": "subscription.created",
        "event_name": "Subscription Created",
        "description": (
            "Emitted when a Subscription record is created from a recurring "
            "PaymentRequest.  Consumed by the notifications listener "
            "(send confirmation email/SMS)."
        ),
        "topic": "payment_events_subscriptions",
        "data_contract": {
            "subscription_id": "str — opaque public identifier",
            "subscription_literal": "str — human-readable label",
            "payment_request_id": "int",
            "merchant_id": "int",
            "customer_id": "int | None",
        },
    },
    {
        "event_id": "subscription.activated",
        "event_name": "Subscription Activated",
        "description": (
            "Emitted when a subscription transitions from INITIALIZING to ACTIVE "
            "after the first payment method is authorised."
        ),
        "topic": "payment_events_subscriptions",
        "data_contract": {
            "subscription_id": "str",
            "merchant_id": "int",
        },
    },
    {
        "event_id": "subscription.charge_succeeded",
        "event_name": "Subscription Charge Succeeded",
        "description": (
            "Emitted when a scheduled or manual charge completes successfully. "
            "Consumed by the subscription listener (update running totals, reset dunning)."
        ),
        "topic": "payment_events_subscriptions",
        "data_contract": {
            "subscription_id": "str",
            "invoice_id": "str",
            "invoice_literal": "str",
            "amount": "float",
            "merchant_id": "int",
            "transaction_id": "int",
        },
    },
    {
        "event_id": "subscription.charge_failed",
        "event_name": "Subscription Charge Failed",
        "description": (
            "Emitted when a scheduled or manual charge fails. "
            "Consumed by the subscription listener (start dunning, schedule retry)."
        ),
        "topic": "payment_events_subscriptions",
        "data_contract": {
            "subscription_id": "str",
            "invoice_id": "str",
            "amount": "float",
            "merchant_id": "int",
            "error_code": "str | None",
            "error_message": "str | None",
            "dunning_retry_count": "int",
        },
    },
    {
        "event_id": "subscription.dunning_retry_scheduled",
        "event_name": "Subscription Dunning Retry Scheduled",
        "description": "Emitted when a dunning retry is queued for a future attempt.",
        "topic": "payment_events_subscriptions",
        "data_contract": {
            "subscription_id": "str",
            "retry_number": "int",
            "retry_at": "ISO8601 datetime",
            "merchant_id": "int",
        },
    },
    {
        "event_id": "subscription.dunning_exhausted",
        "event_name": "Subscription Dunning Exhausted",
        "description": (
            "Emitted when max dunning retries are exceeded and the subscription "
            "transitions to DUNNING_EXHAUSTED.  Consumed by the notifications "
            "listener (alert merchant)."
        ),
        "topic": "payment_events_subscriptions",
        "data_contract": {
            "subscription_id": "str",
            "merchant_id": "int",
            "exhausted_at": "ISO8601 datetime",
        },
    },
    {
        "event_id": "subscription.cancelled",
        "event_name": "Subscription Cancelled",
        "description": "Emitted when a subscription is cancelled by merchant or system.",
        "topic": "payment_events_subscriptions",
        "data_contract": {
            "subscription_id": "str",
            "merchant_id": "int",
            "reason": "str | None",
            "actor_type": "str — merchant | system",
        },
    },
    {
        "event_id": "subscription.completed",
        "event_name": "Subscription Completed",
        "description": "Emitted when all billing cycles are fulfilled.",
        "topic": "payment_events_subscriptions",
        "data_contract": {
            "subscription_id": "str",
            "merchant_id": "int",
            "total_paid": "float",
            "invoices_paid": "int",
        },
    },
    {
        "event_id": "subscription.paused",
        "event_name": "Subscription Paused",
        "description": "Emitted when a merchant explicitly pauses a subscription.",
        "topic": "payment_events_subscriptions",
        "data_contract": {
            "subscription_id": "str",
            "merchant_id": "int",
        },
    },
    {
        "event_id": "subscription.resumed",
        "event_name": "Subscription Resumed",
        "description": "Emitted when a paused subscription is resumed.",
        "topic": "payment_events_subscriptions",
        "data_contract": {
            "subscription_id": "str",
            "merchant_id": "int",
        },
    },
]
