/**
 * Aff 链接工具函数
 *
 * - parseAffCode(url): 从 URL 中提取 aff 参数
 * - buildAffUrl(baseUrl, affCode, affParam): 向基础链接注入 aff 参数，生成最终 aff 链接
 * - stripAffParam(url): 去掉 URL 中的 aff 参数，得到干净的基础链接
 */

const { URL } = require('url');

/** 常见 aff 参数名（按优先级） */
const AFF_PARAM_NAMES = ['aff', 'affid', 'aff_id', 'ref', 'refid', 'ref_id', 'referral', 'partner', 'affiliate'];

/**
 * 从 URL 中提取 aff 参数
 * @param {string} urlStr
 * @returns {{ param: string, value: string } | null}
 */
function parseAffCode(urlStr) {
  if (!urlStr) return null;
  try {
    const u = new URL(urlStr);
    for (const key of AFF_PARAM_NAMES) {
      const val = u.searchParams.get(key);
      if (val) {
        return { param: key, value: val };
      }
    }
    return null;
  } catch {
    return null;
  }
}

/**
 * 向基础 URL 注入 aff 参数，生成最终 aff 链接
 * 如果 URL 已经包含该参数，替换为新值
 *
 * @param {string} baseUrl 基础链接（可以是含或不含 aff 的）
 * @param {string} affCode aff 值
 * @param {string} [affParam='aff'] aff 参数名
 * @returns {string} 最终 aff 链接
 */
function buildAffUrl(baseUrl, affCode, affParam) {
  if (!baseUrl) return '';
  if (!affCode) return baseUrl;
  affParam = affParam || 'aff';

  try {
    const u = new URL(baseUrl);
    u.searchParams.set(affParam, affCode);
    return u.toString();
  } catch {
    // URL 格式异常，尝试简单拼接
    const sep = baseUrl.includes('?') ? '&' : '?';
    return `${baseUrl}${sep}${affParam}=${encodeURIComponent(affCode)}`;
  }
}

/**
 * 去掉 URL 中的 aff 参数，返回干净的基础链接
 * @param {string} urlStr
 * @returns {string}
 */
function stripAffParam(urlStr) {
  if (!urlStr) return '';
  try {
    const u = new URL(urlStr);
    for (const key of AFF_PARAM_NAMES) {
      u.searchParams.delete(key);
    }
    return u.toString();
  } catch {
    return urlStr;
  }
}

module.exports = {
  AFF_PARAM_NAMES,
  parseAffCode,
  buildAffUrl,
  stripAffParam,
};
