/**
 * resolveAvatar — the single authority that turns the polymorphic
 * (avatar_type + avatar_value + approval) state into a render descriptor.
 * No call site branches on avatar_type itself; they consume the descriptor.
 */
import { gravatarUrl } from './gravatar';

export type AvatarResolution =
  | { kind: 'image'; url: string; pipeline: 'r2-variant' | 'external' }
  | { kind: 'icon'; name: string };

export interface ResolveAvatarUser {
  avatarType: 'ICON' | 'GRAVATAR' | 'UPLOADED';
  avatarValue: string;
  avatarApprovalStatus: 'PENDING' | 'APPROVED' | 'REJECTED' | null;
  pendingAvatarValue: string | null;
}

export interface ResolveAvatarOpts {
  /** Owner views their own pending (under-review) upload; public viewers do not. */
  viewerIsOwner: boolean;
  /** Pixel size for external (gravatar) URLs. Default 240. */
  size?: number;
}

const ICON_FALLBACK: AvatarResolution = { kind: 'icon', name: 'user' };

export function resolveAvatar(u: ResolveAvatarUser, opts: ResolveAvatarOpts): AvatarResolution {
  const size = opts.size ?? 240;
  switch (u.avatarType) {
    case 'ICON':
      return { kind: 'icon', name: u.avatarValue || 'user' };
    case 'GRAVATAR':
      if (!u.avatarValue) return ICON_FALLBACK;
      return { kind: 'image', url: gravatarUrl(u.avatarValue, size, 'mp'), pipeline: 'external' };
    case 'UPLOADED': {
      if (u.avatarApprovalStatus === 'APPROVED' && u.avatarValue) {
        return { kind: 'image', url: u.avatarValue, pipeline: 'r2-variant' };
      }
      if (u.avatarApprovalStatus === 'PENDING' && opts.viewerIsOwner && u.pendingAvatarValue) {
        return { kind: 'image', url: u.pendingAvatarValue, pipeline: 'r2-variant' };
      }
      return ICON_FALLBACK;
    }
    default:
      return ICON_FALLBACK;
  }
}
