/**
 * 头像颜色工具
 * 基于 VI 设计系统 §8 头像颜色系统
 *
 * 用法：
 *   import { nameToAvatarColor } from '../../utils/avatar-color'
 *   const avatarColor = nameToAvatarColor(String(memberId))  // => 'blue'
 *   // wxml: class="avatar-{{rec.avatarColor}}"
 *
 * 未知客户（空字符串/散客）返回 'default'（灰色），对应 app.wxss .avatar-default。
 */

/** 24 色标准色板 key 列表（与 app.wxss .avatar-{key} 一一对应） */
export const AVATAR_PALETTE = [
  'blue',
  'indigo',
  'violet',
  'purple',
  'fuchsia',
  'pink',
  'rose',
  'red',
  'orange',
  'amber',
  'yellow',
  'lime',
  'green',
  'emerald',
  'teal',
  'cyan',
  'sky',
  'slate',
  'coral',
  'mint',
  'lavender',
  'gold',
  'crimson',
  'ocean',
] as const

export type AvatarColorKey = typeof AVATAR_PALETTE[number] | 'default'

/**
 * 简单字符串哈希（djb2 变体），将任意字符串映射为 32 位正整数。
 * 比单字符 charCode 取模分布更均匀，相近 ID 也能产生不同颜色。
 */
function simpleHash(str: string): number {
  let hash = 5381
  for (let i = 0; i < str.length; i++) {
    // hash * 33 + charCode，无符号右移保持正数
    hash = ((hash << 5) + hash + str.charCodeAt(i)) >>> 0
  }
  return hash
}

/**
 * 根据标识符（推荐用 member_id 字符串）稳定映射到头像颜色 key。
 * 相同输入永远返回相同颜色。
 *
 * - 空字符串 / "0" / 负数字符串 → 'default'（灰色，未知客户/散客）
 * - 其他 → djb2 哈希取模，24 色均匀分布
 *
 * @param identifier member_id 字符串或其他标识符
 * @returns AvatarColorKey
 */
export function nameToAvatarColor(identifier: string): AvatarColorKey {
  // 未知客户 / 散客：空、"0"、负数
  if (!identifier || identifier === '0' || identifier === 'undefined' || identifier === 'null') {
    return 'default'
  }
  const num = Number(identifier)
  if (!isNaN(num) && num <= 0) {
    return 'default'
  }
  return AVATAR_PALETTE[simpleHash(identifier) % AVATAR_PALETTE.length]
}
