/**
 * 사용자 역할 색상 카탈로그
 *
 * SSOT: backend `auth_role.color_hex` (V017 추가).
 *
 * 동작 방식:
 *  - 백엔드에서 fetch한 RoleWithPermissions[]의 colorHex가 1차 source
 *  - DB에 colorHex가 NULL이거나 미등록 역할은 ROLE_FALLBACK_PALETTE에서
 *    role code 해시 기반으로 안정적 색상 할당
 *
 * 사용처: MainLayout, UserRoleAssignDialog, PermissionsPanel, AccessControl
 */

/** 기본 색상 팔레트 — DB color_hex가 없을 때 폴백 */
export const ROLE_DEFAULT_PALETTE: string[] = [
  '#ef4444', // red
  '#f97316', // orange
  '#eab308', // yellow
  '#22c55e', // green
  '#06b6d4', // cyan
  '#3b82f6', // blue
  '#a855f7', // purple
  '#ec4899', // pink
  '#64748b', // slate
  '#84cc16', // lime
  '#14b8a6', // teal
  '#f59e0b', // amber
];

/** 빌트인 5개 역할의 기본 색상 (백엔드 V017 시드와 동일) */
const BUILTIN_ROLE_COLORS: Record<string, string> = {
  ADMIN: '#ef4444',
  OPERATOR: '#3b82f6',
  ANALYST: '#a855f7',
  FIELD: '#22c55e',
  VIEWER: '#eab308',
};

/** 백엔드 fetch 결과를 캐시 — 역할 코드 → colorHex */
let roleColorCache: Record<string, string | null> = {};

/** RoleWithPermissions[] fetch 결과로 캐시 갱신 (RoleStore 등에서 호출) */
export function updateRoleColorCache(roles: { roleCd: string; colorHex: string | null }[]): void {
  roleColorCache = {};
  roles.forEach((r) => {
    roleColorCache[r.roleCd] = r.colorHex;
  });
}

/** 코드 해시 기반 안정적 폴백 색상 */
function hashFallbackColor(roleCd: string): string {
  let hash = 0;
  for (let i = 0; i < roleCd.length; i++) hash = (hash * 31 + roleCd.charCodeAt(i)) | 0;
  return ROLE_DEFAULT_PALETTE[Math.abs(hash) % ROLE_DEFAULT_PALETTE.length];
}

/**
 * 역할 코드 → hex 색상.
 * 우선순위: 캐시(DB) → 빌트인 → 해시 폴백
 */
export function getRoleColorHex(roleCd: string): string {
  const cached = roleColorCache[roleCd];
  if (cached) return cached;
  if (BUILTIN_ROLE_COLORS[roleCd]) return BUILTIN_ROLE_COLORS[roleCd];
  return hashFallbackColor(roleCd);
}

/**
 * hex → Tailwind 유사 클래스 묶음.
 * 인라인 style이 가능한 환경에서는 getRoleColorHex 직접 사용 권장.
 *
 * 클래스 기반이 필요한 곳을 위한 호환 함수.
 */
export function getRoleBadgeStyle(roleCd: string): React.CSSProperties {
  const hex = getRoleColorHex(roleCd);
  return {
    backgroundColor: hex,
    borderColor: hex,
    color: '#0f172a', // slate-900 (badgeVariants 정책과 동일)
  };
}

/** import('react') 회피용 type-only import */
import type React from 'react';
