/*
 * M18 시스템관리 '메시지 관리' 실배선 API 계약 (#35 · V48 sys_message).
 * 정본: MessageController(com.zioinfo.kintex.system.message) —
 *   - GET    /api/admin/messages?category=&locale=   목록            [ADMIN]
 *   - GET    /api/admin/messages/{code}              코드별 로케일   [ADMIN]
 *   - POST   /api/admin/messages                     생성/수정 upsert [ADMIN]
 *   - DELETE /api/admin/messages/{code}?locale=      삭제(locale 옵션)[ADMIN]
 *   - POST   /api/messages/{code}/render?locale=     {params} 치환 미리보기 [인증]
 * 템플릿은 {name}·{eventName} 등 중괄호 플레이스홀더 — 실값(PII·시크릿) 미저장.
 */
import { api } from '../../api/client';

export interface SysMessage {
  msgCode: string;
  locale: string | null;
  category: string;
  title: string;
  template: string;
  useYn: string | null;
  updatedAt: string | null;
}

export interface RenderResult {
  code: string;
  locale: string | null;
  text: string;
}

export const messageApi = {
  list: (p: { category?: string; locale?: string } = {}) => {
    const qs = new URLSearchParams();
    if (p.category) qs.set('category', p.category);
    if (p.locale) qs.set('locale', p.locale);
    const q = qs.toString();
    return api.get<SysMessage[]>(`/api/admin/messages${q ? `?${q}` : ''}`);
  },
  byCode: (code: string) => api.get<SysMessage[]>(`/api/admin/messages/${encodeURIComponent(code)}`),
  save: (msg: SysMessage) => api.post<void>('/api/admin/messages', msg),
  remove: (code: string, locale?: string) =>
    api.del<void>(
      `/api/admin/messages/${encodeURIComponent(code)}${locale ? `?locale=${encodeURIComponent(locale)}` : ''}`,
    ),
  render: (code: string, locale: string | null, params: Record<string, string>) =>
    api.post<RenderResult>(
      `/api/messages/${encodeURIComponent(code)}/render${locale ? `?locale=${encodeURIComponent(locale)}` : ''}`,
      { params },
    ),
};

/** V48 시드 분류 정본 — 백엔드는 자유 문자열이나 UI 는 이 목록 + 목록에서 발견된 값을 병합해 노출. */
export const MESSAGE_CATEGORIES = ['AUCTION', 'SETTLEMENT', 'ACCOUNT', 'VISITOR', 'MARKETING'] as const;
export const MESSAGE_LOCALES = ['ko', 'en', 'zh', 'ja'] as const;

/** template 의 {key} 플레이스홀더 추출(중복 제거·등장 순서 유지). */
export function extractPlaceholders(template: string): string[] {
  const found: string[] = [];
  for (const m of template.matchAll(/\{(\w+)\}/g)) {
    if (!found.includes(m[1])) found.push(m[1]);
  }
  return found;
}
