import DOMPurify from 'dompurify';

/**
 * HTML 콘텐츠를 sanitize하여 XSS 공격을 방지합니다.
 * 게시판, 팝업, 문의 등 사용자 입력 HTML을 렌더링할 때 반드시 사용하세요.
 */
export function sanitizeHTML(dirty: string): string {
  if (typeof window === 'undefined') return dirty;

  return DOMPurify.sanitize(dirty, {
    ALLOWED_TAGS: [
      // 텍스트 서식
      'p', 'br', 'strong', 'em', 'u', 's', 'sub', 'sup', 'mark',
      'h1', 'h2', 'h3', 'h4', 'h5', 'h6',
      'blockquote', 'pre', 'code', 'hr',
      // 리스트
      'ul', 'ol', 'li',
      // 링크 & 미디어
      'a', 'img',
      // 테이블
      'table', 'thead', 'tbody', 'tfoot', 'tr', 'th', 'td', 'caption', 'colgroup', 'col',
      // 레이아웃
      'div', 'span',
    ],
    ALLOWED_ATTR: [
      'href', 'target', 'rel',
      'src', 'alt', 'width', 'height',
      'class', 'style',
      'colspan', 'rowspan', 'scope',
      'align', 'valign',
    ],
    FORBID_TAGS: ['script', 'iframe', 'object', 'embed', 'form', 'input', 'textarea', 'select', 'button'],
    FORBID_ATTR: ['onerror', 'onload', 'onclick', 'onmouseover', 'onfocus', 'onblur', 'onsubmit', 'onchange'],
    ALLOW_DATA_ATTR: false,
  });
}

/**
 * 인쇄용 HTML sanitize - 테이블/스타일 허용 범위가 더 넓음
 */
export function sanitizeHTMLForPrint(dirty: string): string {
  if (typeof window === 'undefined') return dirty;

  return DOMPurify.sanitize(dirty, {
    ALLOWED_TAGS: [
      'p', 'br', 'strong', 'em', 'u', 's', 'sub', 'sup',
      'h1', 'h2', 'h3', 'h4', 'h5', 'h6',
      'blockquote', 'pre', 'code', 'hr',
      'ul', 'ol', 'li',
      'a', 'img',
      'table', 'thead', 'tbody', 'tfoot', 'tr', 'th', 'td', 'caption', 'colgroup', 'col',
      'div', 'span', 'section', 'header', 'footer',
    ],
    ALLOWED_ATTR: [
      'href', 'target', 'rel',
      'src', 'alt', 'width', 'height',
      'class', 'style', 'id',
      'colspan', 'rowspan', 'scope',
      'align', 'valign',
    ],
    FORBID_TAGS: ['script', 'iframe', 'object', 'embed', 'form', 'input', 'textarea', 'select', 'button'],
    FORBID_ATTR: ['onerror', 'onload', 'onclick', 'onmouseover', 'onfocus', 'onblur', 'onsubmit', 'onchange'],
    ALLOW_DATA_ATTR: false,
  });
}
