type TranslateFn = (key: string) => string;

function normalizeLabel(label: string): string {
  return label.trim().toLowerCase().replace(/[\s-]+/g, '_');
}

function tryTranslate(t: TranslateFn, key: string, fallback: string): string {
  const value = t(key);
  return value === key || value.includes(':') ? fallback : value;
}

const STATUS_SLUGS = ['open', 'pending', 'resolved', 'closed'] as const;
const PRIORITY_SLUGS = ['low', 'medium', 'high', 'urgent'] as const;

/** Maps English API metric labels to localized UI strings. */
export function translateMetricLabel(label: string, t: TranslateFn): string {
  const slug = normalizeLabel(label);

  if (slug === 'created') {
    return t('dashboard:chartSeries.created');
  }
  if (slug === 'closed') {
    return t('dashboard:chartSeries.closed');
  }
  if (slug === 'uncategorized') {
    return t('dashboard:chartLabels.uncategorized');
  }

  if (STATUS_SLUGS.includes(slug as (typeof STATUS_SLUGS)[number])) {
    return tryTranslate(t, `tickets:status.${slug}`, label);
  }

  if (PRIORITY_SLUGS.includes(slug as (typeof PRIORITY_SLUGS)[number])) {
    return tryTranslate(t, `tickets:priority.${slug}`, label);
  }

  return label;
}

export function buildLabelMap(labels: string[], t: TranslateFn): Record<string, string> {
  return Object.fromEntries(labels.map((label) => [label, translateMetricLabel(label, t)]));
}
