import { maskPhoneFromHint } from '@/lib/format';
import type { UserSummary } from './types.js';

const BOM = '\uFEFF';

function escapeCsvCell(value: string | number | boolean): string {
  let str = String(value);
  if (/^[=+\-@\t\r]/.test(str)) str = "'" + str;
  if (/[",\n\r]/.test(str)) {
    return `"${str.replace(/"/g, '""')}"`;
  }
  return str;
}

const HEADERS = [
  'id',
  'displayName',
  'realName',
  'defaultCity',
  'email',
  'phoneHintMasked',
  'accountState',
  'purchaseCount',
  'isAdmin',
  'createdAt',
] as const;

export function usersRowsToCsv(rows: UserSummary[]): string {
  const headerLine = HEADERS.join(',');
  const lines = rows.map((r) =>
    [
      r.id,
      r.displayName ?? '',
      r.realName ?? '',
      r.defaultCity ?? '',
      r.email ?? '',
      maskPhoneFromHint(r.phoneHint) ?? '',
      r.accountState,
      r.purchaseCount,
      r.isAdmin,
      r.createdAt.toISOString(),
    ]
      .map(escapeCsvCell)
      .join(','),
  );
  return BOM + [headerLine, ...lines].join('\n');
}
