/**
 * 版权水印中间件
 * 
 * 功能：在 HTML 响应中自动注入版权信息声明
 * 适用页面：PC前台、H5移动端、管理后台
 * 
 * 实现方式：拦截 res.send 和 res.sendFile，在 HTML 中注入版权div
 * 同时通过 write/end 拦截器处理流式输出
 * 不依赖前端模板，前端无法绕过
 */

const { getSystemCopyright } = require('../lib/license');
// 省胜优铺授权：优先使用我们的授权控制版权（199~带版权/599~去版权/免费~显示省胜优铺）
const ssyp = require('../lib/ssyp-license');

/**
 * 检查是否已经输出过版权（防止重复注入）
 */
    // NOTE: hasCopyrightInjected 已处理字符串/非字符串边界，大写兼容非必需（注入字串固定为 litemall-copyright）

function hasCopyrightInjected(body) {
  return typeof body === 'string' && body.indexOf('litemall-copyright') !== -1;
}

/**
 * 在 HTML body 中注入版权信息
 * @param {string} html - 原始 HTML
 * @returns {string} 注入后的 HTML
 */
function injectCopyright(html) {
  if (!html || typeof html !== 'string') return html;
  if (hasCopyrightInjected(html)) return html;
  
  // 省胜优铺：由我们的授权模块决定版权。
  //  getBranding() 返回 null = 599去版权（不注入）；返回 HTML = 199/免费显示省胜优铺
  const branding = ssyp.getBranding();
  if (branding === null) {
    // 599 去版权：彻底移除旧的 litemall-copyright 版权依赖，且不注入任何版权
    // 注意：不能直接用正则删，可能误伤。这里直接不注入，返回原 HTML
    return html;
  }
  const copyright = branding;
  
  // 在 </body> 前注入（优先）
  const bodyEndIdx = html.lastIndexOf('</body>');
  if (bodyEndIdx !== -1) {
    return html.slice(0, bodyEndIdx) + '\n' + copyright + '\n' + html.slice(bodyEndIdx);
  }
  
  // 在 </html> 前注入
  const htmlEndIdx = html.lastIndexOf('</html>');
  if (htmlEndIdx !== -1) {
    return html.slice(0, htmlEndIdx) + '\n' + copyright + '\n' + html.slice(htmlEndIdx);
  }
  
  // 追加到底部
  return html + '\n' + copyright;
}

/**
 * 判断响应是否为 text/html
 */
function isHtmlResponse(res) {
  const ct = res.get('Content-Type');
  return ct && ct.includes('text/html');
}

/**
 * 版权水印中间件
 */
function copyrightMiddleware(req, res, next) {
  // 跳过移动端页面和搬家门户（Vue 3 SPA 已有编译版权 / 门户页面不需要水印）
  if (req.path === '/mobile' || req.path.startsWith('/mobile/') || req.path === '/migration/portal' || req.path === '/pc' || req.path.startsWith('/pc/')) {
    return next();
  }
  
  // ---------- 拦截 res.send (Express API 返回 HTML) ----------
  const originalSend = res.send.bind(res);
  res.send = function(body) {
    if (typeof body === 'string' && isHtmlResponse(res)) {
      body = injectCopyright(body);
    }
    return originalSend(body);
  };

  // ---------- 拦截 res.sendFile (静态文件) ----------
  const originalSendFile = res.sendFile.bind(res);
  res.sendFile = function(path, options, callback) {
    // 保存原始 callback
    const originalCallback = callback;
    
    // 包装 callback 以在文件发送完成后修改
    const wrappedCallback = function(err) {
      if (originalCallback) originalCallback(err);
    };
    
    // 使用 write/end 拦截来捕获文件内容
    // 但由于 sendFile 是流式的，我们需要另一种方法
    // 使用 res.write 和 res.end 的 override
    
    // 直接调用 sendFile
    return originalSendFile(path, options, wrappedCallback);
  };

  // ---------- 拦截 res.write 和 res.end (流式输出) ----------
  const originalWrite = res.write.bind(res);
  const originalEnd = res.end.bind(res);
  
  let chunks = [];
  let intercepted = false;
  
  res.write = function(chunk, encoding, callback) {
    try {
      const _isHtml = isHtmlResponse(res);
      if (!intercepted && _isHtml) {
        chunks.push(chunk);
        if (typeof chunk === 'string' || Buffer.isBuffer(chunk)) {
          return true;
        }
      }
    } catch(e) {
      // 兜底：中间件异常时恢复原始行为
      return originalWrite(chunk, encoding, callback);
    }
    return originalWrite(chunk, encoding, callback);
  };
  
  res.end = function(chunk, encoding, callback) {
    try {
      if (chunk) {
        if (typeof chunk === 'string' || Buffer.isBuffer(chunk)) {
          if (!intercepted && isHtmlResponse(res)) {
            chunks.push(chunk);
          } else {
            return originalEnd(chunk, encoding, callback);
          }
        } else {
          return originalEnd(chunk, encoding, callback);
        }
      }
      // existing logic continues...
      
      if (chunks.length > 0 && isHtmlResponse(res)) {
        let fullBody = chunks.map(c => Buffer.isBuffer(c) ? c.toString('utf8') : c).join('');
        fullBody = injectCopyright(fullBody);
        intercepted = true;
        const finalBuf = Buffer.from(fullBody, 'utf8');
        // 重置 Content-Length，避免与注入后实际字节数不匹配导致截断
        res.set('Content-Length', String(finalBuf.length));
        return originalEnd(finalBuf, encoding, callback);
      }
    } catch(e) {
      // 兜底：中间件异常时直接原始结束
      if (chunks.length > 0) {
        try { chunks.forEach(c => originalWrite(c)); } catch(e2) {}
      }
      return originalEnd(chunk, encoding, callback);
    }
    
    return originalEnd(chunk, encoding, callback);
  };

  next();
}

module.exports = { copyrightMiddleware };
