// apps/web/src/server/notifications/event-registry.ts
export type NotifTier = 'critical' | 'optional' | 'marketing';

export type NotifEventMeta = {
  tier: NotifTier;
  durable: boolean; // write to notifications table?
  pushFallback: boolean; // send Web Push if user offline?
  channelKinds: ReadonlyArray<'notif' | 'live' | 'chat' | 'presence'>;
  audience: 'customer' | 'vendor' | 'admin' | 'any';
};

export const EVENT_REGISTRY = {
  // CRITICAL — customer
  'order.confirmed': {
    tier: 'critical',
    durable: true,
    pushFallback: true,
    channelKinds: ['notif'],
    audience: 'customer',
  },
  'payment.failed': {
    tier: 'critical',
    durable: true,
    pushFallback: true,
    channelKinds: ['notif'],
    audience: 'customer',
  },
  'redemption.window_opened': {
    tier: 'critical',
    durable: true,
    pushFallback: true,
    channelKinds: ['notif'],
    audience: 'customer',
  },
  'redemption.expiring_soon': {
    tier: 'critical',
    durable: true,
    pushFallback: true,
    channelKinds: ['notif'],
    audience: 'customer',
  },
  'groupdeal.unlocked': {
    tier: 'critical',
    durable: true,
    pushFallback: true,
    channelKinds: ['notif', 'live'],
    audience: 'customer',
  },
  'groupdeal.slot_filled': {
    tier: 'optional',
    durable: false,
    pushFallback: false,
    channelKinds: ['live'],
    audience: 'customer',
  },
  'groupdeal.expired_no_unlock': {
    tier: 'critical',
    durable: true,
    pushFallback: true,
    channelKinds: ['notif'],
    audience: 'customer',
  },
  'refund.issued': {
    tier: 'critical',
    durable: true,
    pushFallback: true,
    channelKinds: ['notif'],
    audience: 'customer',
  },
  'chat.message': {
    tier: 'critical',
    durable: true,
    pushFallback: true,
    channelKinds: ['notif', 'chat'],
    audience: 'any',
  },
  'chat.typing': {
    tier: 'optional',
    durable: false,
    pushFallback: false,
    channelKinds: ['presence'],
    audience: 'any',
  },
  'chat.read_receipt': {
    tier: 'optional',
    durable: false,
    pushFallback: false,
    channelKinds: ['presence'],
    audience: 'any',
  },
  'presence.peer_online': {
    tier: 'optional',
    durable: false,
    pushFallback: false,
    channelKinds: ['presence'],
    audience: 'any',
  },
  'personal_offer.new': {
    tier: 'optional',
    durable: true,
    pushFallback: true,
    channelKinds: ['notif'],
    audience: 'customer',
  },
  'personal_offer.expiring': {
    tier: 'optional',
    durable: true,
    pushFallback: true,
    channelKinds: ['notif'],
    audience: 'customer',
  },
  'deal.followed_published': {
    tier: 'optional',
    durable: true,
    pushFallback: false,
    channelKinds: ['notif'],
    audience: 'customer',
  },
  'deal.back_in_stock': {
    tier: 'optional',
    durable: true,
    pushFallback: true,
    channelKinds: ['notif'],
    audience: 'customer',
  },
  'loyalty.points_credited': {
    tier: 'optional',
    durable: true,
    pushFallback: false,
    channelKinds: ['notif'],
    audience: 'customer',
  },
  'system.maintenance_window': {
    tier: 'marketing',
    durable: true,
    pushFallback: false,
    channelKinds: ['notif'],
    audience: 'any',
  },

  // CRITICAL — vendor
  'order.placed': {
    tier: 'critical',
    durable: true,
    pushFallback: true,
    channelKinds: ['notif'],
    audience: 'vendor',
  },
  'redemption.completed': {
    tier: 'critical',
    durable: true,
    pushFallback: true,
    channelKinds: ['notif'],
    audience: 'vendor',
  },
  'payout.scheduled': {
    tier: 'critical',
    durable: true,
    pushFallback: true,
    channelKinds: ['notif'],
    audience: 'vendor',
  },
  'payout.released': {
    tier: 'critical',
    durable: true,
    pushFallback: true,
    channelKinds: ['notif'],
    audience: 'vendor',
  },
  'deal.approved': {
    tier: 'critical',
    durable: true,
    pushFallback: true,
    channelKinds: ['notif'],
    audience: 'vendor',
  },
  'deal.rejected': {
    tier: 'critical',
    durable: true,
    pushFallback: true,
    channelKinds: ['notif'],
    audience: 'vendor',
  },
  'deal.published': {
    tier: 'optional',
    durable: true,
    pushFallback: false,
    channelKinds: ['notif', 'live'],
    audience: 'vendor',
  },
  'deal.expiring_soon': {
    tier: 'optional',
    durable: true,
    pushFallback: false,
    channelKinds: ['notif'],
    audience: 'vendor',
  },
  'deal.viewer_count_tick': {
    tier: 'optional',
    durable: false,
    pushFallback: false,
    channelKinds: ['live'],
    audience: 'vendor',
  },
  'review.posted': {
    tier: 'optional',
    durable: true,
    pushFallback: false,
    channelKinds: ['notif'],
    audience: 'vendor',
  },
  'support_ticket.replied': {
    tier: 'critical',
    durable: true,
    pushFallback: true,
    channelKinds: ['notif'],
    audience: 'any',
  },
  'support_ticket.ai_reply': {
    tier: 'critical',
    durable: false,
    pushFallback: false,
    channelKinds: ['live'],
    audience: 'any',
  },
  'vendor_onboarding.step_required': {
    tier: 'critical',
    durable: true,
    pushFallback: true,
    channelKinds: ['notif'],
    audience: 'vendor',
  },

  // CRITICAL — admin
  'support_ticket.created': {
    tier: 'critical',
    durable: true,
    pushFallback: true,
    channelKinds: ['notif', 'live'],
    audience: 'admin',
  },
  'support_ticket.sla_breach': {
    tier: 'critical',
    durable: true,
    pushFallback: true,
    channelKinds: ['notif', 'live'],
    audience: 'admin',
  },
  'vendor_application.submitted': {
    tier: 'critical',
    durable: true,
    pushFallback: true,
    channelKinds: ['notif', 'live'],
    audience: 'admin',
  },
  'deal.flagged': {
    tier: 'critical',
    durable: true,
    pushFallback: true,
    channelKinds: ['notif', 'live'],
    audience: 'admin',
  },
  'dispute.opened': {
    tier: 'critical',
    durable: true,
    pushFallback: true,
    channelKinds: ['notif', 'live'],
    audience: 'admin',
  },
  'payment.reconcile_failure': {
    tier: 'critical',
    durable: true,
    pushFallback: true,
    channelKinds: ['notif', 'live'],
    audience: 'admin',
  },
  'system.queue_backlog': {
    tier: 'critical',
    durable: true,
    pushFallback: false,
    channelKinds: ['notif', 'live'],
    audience: 'admin',
  },
  'system.error_spike': {
    tier: 'critical',
    durable: true,
    pushFallback: false,
    channelKinds: ['notif', 'live'],
    audience: 'admin',
  },
  'admin.audit_log_entry': {
    tier: 'optional',
    durable: true,
    pushFallback: false,
    channelKinds: ['notif', 'live'],
    audience: 'admin',
  },
  'metric.daily_summary': {
    tier: 'marketing',
    durable: true,
    pushFallback: false,
    channelKinds: ['notif'],
    audience: 'admin',
  },

  // ─── Returns / RMA ────────────────────────────────────────────────────────
  'returns.opened': {
    tier: 'critical',
    durable: true,
    pushFallback: true,
    channelKinds: ['notif'],
    audience: 'customer',
  },
  'returns.approved': {
    tier: 'critical',
    durable: true,
    pushFallback: true,
    channelKinds: ['notif'],
    audience: 'customer',
  },
  'returns.tracking_entered': {
    tier: 'critical',
    durable: true,
    pushFallback: true,
    channelKinds: ['notif'],
    audience: 'vendor',
  },
  'returns.received': {
    tier: 'critical',
    durable: true,
    pushFallback: true,
    channelKinds: ['notif'],
    audience: 'customer',
  },
  'returns.refunded': {
    tier: 'critical',
    durable: true,
    pushFallback: true,
    channelKinds: ['notif'],
    audience: 'customer',
  },
  'returns.auto_refunded_sla': {
    tier: 'critical',
    durable: true,
    pushFallback: true,
    channelKinds: ['notif'],
    audience: 'customer',
  },
  'returns.denied': {
    tier: 'critical',
    durable: true,
    pushFallback: true,
    channelKinds: ['notif'],
    audience: 'customer',
  },
  'returns.sla_expired_buyer_ship': {
    tier: 'critical',
    durable: true,
    pushFallback: true,
    channelKinds: ['notif'],
    audience: 'customer',
  },
  'returns.cancelled': {
    tier: 'critical',
    durable: true,
    pushFallback: true,
    channelKinds: ['notif'],
    audience: 'customer',
  },

  // ─── ITEM (physical delivery) ─────────────────────────────────────────────
  'item.order_confirmed': {
    tier: 'critical',
    durable: true,
    pushFallback: true,
    channelKinds: ['notif'],
    audience: 'customer',
  },
  'item.shipped': {
    tier: 'critical',
    durable: true,
    pushFallback: true,
    channelKinds: ['notif'],
    audience: 'customer',
  },
  'item.out_for_delivery': {
    tier: 'optional',
    durable: false,
    pushFallback: true,
    channelKinds: ['notif'],
    audience: 'customer',
  },
  'item.delivered': {
    tier: 'critical',
    durable: true,
    pushFallback: true,
    channelKinds: ['notif'],
    audience: 'customer',
  },
  'item.delivery_nudge': {
    tier: 'optional',
    durable: true,
    pushFallback: false,
    channelKinds: ['notif'],
    audience: 'customer',
  },
  'item.pickup_ready': {
    tier: 'critical',
    durable: true,
    pushFallback: true,
    channelKinds: ['notif'],
    audience: 'customer',
  },
  'item.handle_sla_warning': {
    tier: 'optional',
    durable: true,
    pushFallback: true,
    channelKinds: ['notif'],
    audience: 'vendor',
  },
  'item.handle_sla_breach': {
    tier: 'critical',
    durable: true,
    pushFallback: true,
    channelKinds: ['notif'],
    audience: 'vendor',
  },
} as const satisfies Record<string, NotifEventMeta>;

export type NotifEvent = keyof typeof EVENT_REGISTRY;

export const COALESCED_EVENTS: ReadonlySet<NotifEvent> = new Set<NotifEvent>([
  'deal.viewer_count_tick',
  'groupdeal.slot_filled',
  'chat.typing',
]);

export function isKnownEvent(s: string): s is NotifEvent {
  return s in EVENT_REGISTRY;
}
export function tierOf(e: NotifEvent): NotifTier {
  return EVENT_REGISTRY[e].tier;
}
export function metaOf(e: NotifEvent): NotifEventMeta {
  return EVENT_REGISTRY[e];
}
