import { _fromCC, B64 } from './config.mjs';

/* eslint-disable */
var re_utob = /[\uD800-\uDBFF][\uDC00-\uDFFFF]|[^\x00-\x7F]/g;
var utob = function utob(u) {
  return u.replace(re_utob, cb_utob);
};
var cb_utob = function cb_utob(c) {
  if (c.length < 2) {
    var cc = c.charCodeAt(0);
    return cc < 0x80 ? c : cc < 0x800 ? _fromCC(0xc0 | cc >>> 6) + _fromCC(0x80 | cc & 0x3f) : _fromCC(0xe0 | cc >>> 12 & 0x0f) + _fromCC(0x80 | cc >>> 6 & 0x3f) + _fromCC(0x80 | cc & 0x3f);
  }
  var cc = 0x10000 + (c.charCodeAt(0) - 0xD800) * 0x400 + (c.charCodeAt(1) - 0xDC00);
  return _fromCC(0xf0 | cc >>> 18 & 0x07) + _fromCC(0x80 | cc >>> 12 & 0x3f) + _fromCC(0x80 | cc >>> 6 & 0x3f) + _fromCC(0x80 | cc & 0x3f);
};
/**
 * 将字符串编码为 Base64 格式
 * 支持 Unicode 字符（包括中文、emoji 等），兼容小程序环境
 * @param str - 要编码的字符串
 * @returns Base64 编码后的字符串
 * @example
 * ```ts
 * encode('Hello World'); // 'SGVsbG8gV29ybGQ='
 * encode('你好世界'); // '5L2g5aW95LiW55WM'
 * encode('😀'); // '8J+YgA=='
 * ```
 */
var encode = function encode(str) {
  return innerEncode(utob(str));
};
/**
 * Base64 编码的内部实现（小程序版本的 btoa）
 * 将 Latin1 范围内的字符串编码为 Base64
 * @param string - 要编码的字符串（仅支持 Latin1 字符）
 * @returns Base64 编码后的字符串
 * @throws {TypeError} 当字符串包含 Latin1 范围外的字符时抛出错误
 * @example
 * ```ts
 * innerEncode('Hello'); // 'SGVsbG8='
 * ```
 */
var innerEncode = function innerEncode(string) {
  string = String(string);
  var bitmap;
  var a;
  var b;
  var c;
  var result = '';
  var i = 0;
  var rest = string.length % 3;
  for (; i < string.length;) {
    if ((a = string.charCodeAt(i++)) > 255 || (b = string.charCodeAt(i++)) > 255 || (c = string.charCodeAt(i++)) > 255) throw new TypeError('Failed to execute \'btoa\' on \'Window\': The string to be encoded contains characters outside of the Latin1 range.');
    bitmap = a << 16 | b << 8 | c;
    result += B64.charAt(bitmap >> 18 & 63) + B64.charAt(bitmap >> 12 & 63) + B64.charAt(bitmap >> 6 & 63) + B64.charAt(bitmap & 63);
  }
  return rest ? result.slice(0, rest - 3) + '==='.substring(rest) : result;
};

export { encode, innerEncode };
