import { HttpErrorResponse } from '@angular/common/http';

import type { ApiErrorBody } from '../models/api.types';

export function escapeHtml(text: string): string {
  return text
    .replace(/&/g, '&amp;')
    .replace(/</g, '&lt;')
    .replace(/>/g, '&gt;')
    .replace(/"/g, '&quot;')
    .replace(/'/g, '&#039;');
}

function summarizeHtmlError(text: string): string | null {
  const t = text.trim();
  if (!t.startsWith('<!') && !t.startsWith('<html')) {
    return null;
  }
  const pre = t.match(/<pre[^>]*>([\s\S]*?)<\/pre>/i);
  if (pre?.[1]) {
    return pre[1].trim();
  }
  const title = t.match(/<title[^>]*>([\s\S]*?)<\/title>/i);
  if (title?.[1]) {
    return title[1].trim();
  }
  return 'Сервер вернул HTML вместо JSON (часто редирект на вход или ошибка прокси).';
}

export function httpErrorMessage(err: unknown): string {
  if (err instanceof HttpErrorResponse) {
    const body = err.error as ApiErrorBody | string | null | undefined;
    if (body && typeof body === 'object' && typeof body.error === 'string') {
      return body.error;
    }
    if (typeof body === 'string' && body.length > 0) {
      const fromHtml = summarizeHtmlError(body);
      if (fromHtml) {
        return fromHtml;
      }
      return body.length > 200 ? `${body.slice(0, 200)}…` : body;
    }
    if (err.message?.includes('Http failure during parsing')) {
      return 'Ответ не JSON (часто HTML страницы входа или ошибка прокси /api). Перезапустите `npm start` и проверьте proxy.conf.cjs и `SG_DEV_PROXY_TARGET` в `.env`.';
    }
    return err.message || `HTTP ${err.status}`;
  }
  if (err instanceof Error) {
    if (err.message.includes('Http failure during parsing')) {
      return 'Ответ не JSON — проверьте авторизацию и прокси для API.';
    }
    return err.message;
  }
  return 'Неизвестная ошибка';
}
