import ActivityLog from '../models/activityLog.js'

export const ACTIVITY_TYPES = {
  MEMBER_JOINED: 'member_joined',
  EVENT_REGISTERED: 'event_registered',
  EVENT_CANCELLED: 'event_cancelled',
  EVENT_WAITLISTED: 'event_waitlisted',
  CIRCLE_CHANGED: 'circle_changed',
  CONTRIBUTION_CHANGED: 'contribution_changed',
  EMAIL_CHANGED: 'email_changed',
  PROFILE_UPDATED: 'profile_updated',
  SUBSCRIPTION_CREATED: 'subscription_created',
  SUBSCRIPTION_CANCELLED: 'subscription_cancelled',
  STATUS_CHANGED: 'status_changed',
  ROLE_CHANGED: 'role_changed',
  ADMIN_PROFILE_UPDATE: 'admin_profile_update',
  SLACK_INVITED: 'slack_invited',
  EMAIL_SENT: 'email_sent',
  COMMUNITY_CONNECTIONS_UPDATED: 'community_connections_updated',
  BOARD_UPDATED: 'board_updated',
  BOARD_POST_CREATED: 'board_post_created',
  CONNECTION_REQUESTED: 'connection_requested',
  CONNECTION_CONFIRMED: 'connection_confirmed',
  TAG_SUGGESTED: 'tag_suggested'
}

export const ACTIVITY_TYPE_DEFAULTS = {
  member_joined: 'public',
  event_registered: 'public',
  event_cancelled: 'member',
  event_waitlisted: 'member',
  circle_changed: 'member',
  contribution_changed: 'member',
  email_changed: 'member',
  profile_updated: 'member',
  subscription_created: 'member',
  subscription_cancelled: 'member',
  status_changed: 'admin',
  role_changed: 'admin',
  admin_profile_update: 'admin',
  slack_invited: 'admin',
  email_sent: 'member',
  community_connections_updated: 'member',
  board_updated: 'member',
  board_post_created: 'member',
  connection_requested: 'member',
  connection_confirmed: 'member',
  tag_suggested: 'member'
}

/**
 * Log an activity for a member. Fire-and-forget — catches errors
 * and logs to console without blocking the request.
 *
 * @param {string|ObjectId} memberId
 * @param {string} type - one of ACTIVITY_TYPES values
 * @param {object} [metadata={}]
 * @param {object} [options]
 * @param {string|ObjectId} [options.performedBy] - admin who initiated the action
 * @param {string} [options.visibility] - override default visibility
 * @param {Date} [options.timestamp] - override Date.now (for backfill)
 */
export async function logActivity(memberId, type, metadata = {}, options = {}) {
  try {
    const visibility = options.visibility || ACTIVITY_TYPE_DEFAULTS[type] || 'member'
    const doc = {
      member: memberId,
      type,
      visibility,
      metadata
    }
    if (options.performedBy) doc.performedBy = options.performedBy
    if (options.timestamp) doc.timestamp = options.timestamp

    return await ActivityLog.create(doc)
  } catch (err) {
    console.error(`[activityLog] Failed to log ${type} for member ${memberId}:`, err)
  }
}
