/**
 * Markdown Lite — 軽量マークダウンパーサー
 *
 * AI応答テキストを構造化HTMLに変換する。
 * 外部ライブラリ不使用。最小限のサブセットのみサポート。
 *
 * サポートする構文:
 *   # 見出し (h1)  /  ## 見出し (h2)  /  ### 見出し (h3)
 *   **太字**
 *   - リスト項目
 *   [リンクテキスト](URL)
 *   [CTA:テキスト|URL] (CTAボタンに変換)
 *   通常テキスト → <p>
 */

/**
 * テキストをHTMLに変換
 * @param {string} text - マークダウンテキスト
 * @param {object} opts - { enableCta: boolean }
 * @returns {string} HTML文字列
 */
export function renderMarkdownLite(text, opts = {}) {
  if (!text) return "";

  const lines = text.split("\n");
  const output = [];
  let inList = false;

  for (const line of lines) {
    const trimmed = line.trim();

    // 空行
    if (!trimmed) {
      if (inList) {
        output.push("</ul>");
        inList = false;
      }
      continue;
    }

    // 見出し (#, ##, ###)
    const headingMatch = /^(#{1,3})\s+(.+)$/.exec(trimmed);
    if (headingMatch) {
      if (inList) { output.push("</ul>"); inList = false; }
      const level = headingMatch[1].length;
      const content = escapeHtml(headingMatch[2]);
      output.push(`<h${level} class="agent__md-heading">${content}</h${level}>`);
      continue;
    }

    // リスト項目
    if (trimmed.startsWith("- ") || trimmed.startsWith("* ")) {
      if (!inList) { output.push('<ul class="agent__md-list">'); inList = true; }
      const content = inlineFormat(trimmed.slice(2), opts);
      output.push(`<li>${content}</li>`);
      continue;
    }

    // 通常テキスト
    if (inList) { output.push("</ul>"); inList = false; }
    output.push(`<p class="agent__md-para">${inlineFormat(trimmed, opts)}</p>`);
  }

  if (inList) output.push("</ul>");

  return output.join("");
}

/**
 * インライン書式を処理
 */
function inlineFormat(text, opts = {}) {
  let result = escapeHtml(text);

  // **太字**
  result = result.replace(/\*\*(.+?)\*\*/g, '<strong>$1</strong>');

  // [CTA:テキスト|URL]
  if (opts.enableCta !== false) {
    result = result.replace(
      /\[CTA:(.+?)\|(.+?)\]/g,
      (_, label, url) => isSafeUrl(url)
        // dev.58 W2 レビュー修正S1: target="_blank" rel="noopener" を付与し、
        // 通常リンク(下の [テキスト](URL) テンプレート)と同じフェイルセーフ
        // 不変条件を CTA にも成立させる — widget-app-persistent.js の
        // _handleDelegatedLinkClick() が万一未登録/未実行でも、この属性が
        // 無いと同タブ(iframe 自己遷移)のまま固まってしまう。委譲ハンドラが
        // 正常に動く限り、内部 CTA は同一オリジン分岐で preventDefault
        // されるため同タブ遷移のまま変わらない(target 追加による挙動変化は
        // フォールバック経路のみ)。
        ? `<a class="agent__md-cta" href="${url}" data-cta="true" target="_blank" rel="noopener">${label}</a>`
        : label
    );
  }

  // [テキスト](URL)
  result = result.replace(
    /\[(.+?)\]\((.+?)\)/g,
    (_, label, url) => isSafeUrl(url)
      ? `<a class="agent__md-link" href="${url}" target="_blank" rel="noopener">${label}</a>`
      : label
  );

  return result;
}

/**
 * URLの安全性を検証（javascript: / data: 等の危険なプロトコルを拒否）
 */
function isSafeUrl(url) {
  if (!url) return false;
  // 相対パスは許可
  if (url.startsWith("/") || url.startsWith("./") || url.startsWith("#")) return true;
  // 許可するプロトコル
  try {
    const parsed = new URL(url, "https://placeholder.local");
    return parsed.protocol === "https:" || parsed.protocol === "http:" || parsed.protocol === "tel:" || parsed.protocol === "mailto:";
  } catch {
    return false;
  }
}

/**
 * HTMLエスケープ
 */
function escapeHtml(text) {
  return text
    .replace(/&/g, "&amp;")
    .replace(/</g, "&lt;")
    .replace(/>/g, "&gt;")
    .replace(/"/g, "&quot;")
    .replace(/'/g, "&#39;");
}
