// 标签参数清单 —— 与《数据标签需求》附录 A 对齐
// 每个参数字段说明：
//   key           参数名（英文）
//   label         中文展示名
//   type          String | BigDecimal | Boolean | Date | List | ReferralList
//   hasHistory    是否存在"近 12 个月月末值"变体（List 变体）
//   dateFormat    日期参数格式：YYYY-MM-DD | YYYY-MM（仅 Date 类型）
//   options       枚举取值（String 枚举或多选枚举时使用）
//   multiple      是否为多选枚举（多个枚举值以英文逗号分隔）
//   listItemType  List 元素类型（仅 List 类型使用），用于决定聚合方式（数值可均值/极值，枚举仅计数）
//   desc          补充说明

export const PARAM_TYPE = {
  STRING: 'String',
  NUMBER: 'BigDecimal',
  BOOLEAN: 'Boolean',
  DATE: 'Date',
  LIST: 'List',
  REFERRAL: 'ReferralList'
}

// 运算符清单，按类型分组
export const OPERATORS = {
  // String 自由文本
  STRING_TEXT: [
    { value: 'eq', label: '等于' },
    { value: 'neq', label: '不等于' },
    { value: 'contains', label: '包含' },
    { value: 'notContains', label: '不包含' },
    { value: 'isNull', label: '为空' },
    { value: 'isNotNull', label: '不为空' }
  ],
  // String 枚举
  STRING_ENUM: [
    { value: 'eq', label: '等于' },
    { value: 'neq', label: '不等于' },
    { value: 'in', label: '属于' },
    { value: 'notIn', label: '不属于' },
    { value: 'isNull', label: '为空' },
    { value: 'isNotNull', label: '不为空' }
  ],
  // 数值
  NUMBER: [
    { value: 'eq', label: '=' },
    { value: 'neq', label: '≠' },
    { value: 'gt', label: '>' },
    { value: 'gte', label: '≥' },
    { value: 'lt', label: '<' },
    { value: 'lte', label: '≤' },
    { value: 'between', label: '区间' },
    { value: 'isNull', label: '为空' },
    { value: 'isNotNull', label: '不为空' }
  ],
  // 布尔
  BOOLEAN: [
    { value: 'eq', label: '=' },
    { value: 'neq', label: '≠' }
  ],
  // 日期
  DATE: [
    { value: 'eq', label: '=' },
    { value: 'neq', label: '≠' },
    { value: 'gt', label: '晚于' },
    { value: 'gte', label: '不早于' },
    { value: 'lt', label: '早于' },
    { value: 'lte', label: '不晚于' },
    { value: 'between', label: '区间' },
    { value: 'withinLast', label: '最近 N 日/月/年内' },
    { value: 'beforeLast', label: '超过 N 日/月/年' },
    { value: 'isNull', label: '为空' },
    { value: 'isNotNull', label: '不为空' }
  ]
}

// 时间窗口 - 取值方式
export const TIME_WINDOW_MODES = [
  { value: 'current', label: '当前值' },
  { value: 'specificMonth', label: '指定某月' },
  { value: 'recentMonths', label: '近 N 个月' }
]

// 时间窗口 - 聚合方式（仅取值方式=近 N 个月 时使用）
export const AGGREGATORS_ENUM = [
  { value: 'any', label: '任一月满足' },
  { value: 'all', label: '所有月都满足' },
  { value: 'atLeast', label: '至少 M 个月满足' }
]

export const AGGREGATORS_NUMBER = [
  ...AGGREGATORS_ENUM,
  { value: 'avg', label: '平均值' },
  { value: 'max', label: '最大值' },
  { value: 'min', label: '最小值' }
]

// 枚举字典
export const ENUMS = {
  privateBankTag: [
    { value: '银辉', label: '银辉' },
    { value: '金曜', label: '金曜' },
    { value: '钻皓私人银行客户', label: '钻皓私人银行客户' }
  ],
  validRpq: [
    { value: '0', label: '0 级' },
    { value: '1', label: '1 级' },
    { value: '2', label: '2 级' },
    { value: '3', label: '3 级' },
    { value: '4', label: '4 级' },
    { value: '5', label: '5 级' },
    { value: 'NA', label: 'NA' }
  ],
  assetCategoryDetails: [
    { value: '1', label: '1 存款（定期/通知/个人大额存单）' },
    { value: '2', label: '2 结构性存款（自有）' },
    { value: '3', label: '3 基金相关产品' },
    { value: '4', label: '4 理财产品（代销）' },
    { value: '5', label: '5 代客境外理财海外债券型/结构性票据型（自有）' },
    { value: '6', label: '6 资产管理计划（代销）' },
    { value: '7', label: '7 信托计划（代销）' },
    { value: '8', label: '8 保险产品（代销）' },
    { value: '9', label: '9 预留' }
  ],
  fixedDepositTypes: [
    { value: '1', label: '1 不持有定存' },
    { value: '2', label: '2 持有普通定存（美金）' },
    { value: '3', label: '3 持有普通定存（人民币）' },
    { value: '4', label: '4 持有普通定存（其他币种）' },
    { value: '5', label: '5 持有大额存单（人民币）' }
  ]
}

// 参数分组及清单
export const PARAM_GROUPS = [
  {
    key: 'basic',
    label: '客户基础与身份',
    params: [
      { key: 'mscGroup', label: '客户 MSC Group', type: PARAM_TYPE.STRING, hasHistory: true },
      { key: 'mscCode', label: '客户类型 MSC', type: PARAM_TYPE.STRING, hasHistory: true },
      { key: 'currentMscEntryDate', label: 'Current MSC entry date', type: PARAM_TYPE.DATE, dateFormat: 'YYYY-MM-DD' },
      { key: 'mob', label: '客户 MOB 值（含信用卡）', type: PARAM_TYPE.NUMBER, desc: '取值 0/1/2/3/4/5/6/...' },
      { key: 'firstContactDate', label: 'First contact date', type: PARAM_TYPE.DATE, dateFormat: 'YYYY-MM-DD' },
      { key: 'openDate', label: '开户时间', type: PARAM_TYPE.DATE, dateFormat: 'YYYY-MM-DD' },
      { key: 'city', label: '城市', type: PARAM_TYPE.STRING },
      { key: 'rmType', label: 'RM 类型', type: PARAM_TYPE.STRING },
      { key: 'customerName', label: '客户姓名', type: PARAM_TYPE.STRING }
    ]
  },
  {
    key: 'asset',
    label: '资产与持有',
    params: [
      { key: 'endOfBalance', label: 'End of day balance（所有资金含产品）', type: PARAM_TYPE.NUMBER, hasHistory: true },
      { key: 'avgTrbIncludingHousehold', label: 'TRB 值-Avg TRB 口径（含家庭账户余额）', type: PARAM_TYPE.NUMBER, hasHistory: true },
      { key: 'avgTrbExcludingHousehold', label: 'TRB 值-Avg TRB 口径（不含家庭账户余额）', type: PARAM_TYPE.NUMBER, hasHistory: true },
      {
        key: 'assetCategoryDetails',
        label: '资产大类明细',
        type: PARAM_TYPE.STRING,
        multiple: true,
        options: ENUMS.assetCategoryDetails
      },
      {
        key: 'fixedDepositTypes',
        label: '客户持有定存种类',
        type: PARAM_TYPE.STRING,
        multiple: true,
        options: ENUMS.fixedDepositTypes
      }
    ]
  },
  {
    key: 'premier',
    label: '尊尚 / 私行',
    params: [
      { key: 'isQualifiedLast6Months', label: '近 6 个月是否符合尊尚资格', type: PARAM_TYPE.BOOLEAN },
      { key: 'privateBankTag', label: '私行权益标签', type: PARAM_TYPE.STRING, options: ENUMS.privateBankTag },
      { key: 'firstUpgradePremierDate', label: '首次升级尊尚的时间', type: PARAM_TYPE.DATE, dateFormat: 'YYYY-MM-DD' },
      { key: 'privateBankId', label: '私行 ID 卓越理财尊尚编号', type: PARAM_TYPE.STRING },
      { key: 'premierValidityDate', label: '尊尚资格到期日', type: PARAM_TYPE.DATE, dateFormat: 'YYYY-MM-DD' },
      { key: 'firstAchievementDate', label: '首次达标日期', type: PARAM_TYPE.DATE, dateFormat: 'YYYY-MM' },
      { key: 'firstPBUpgradeDate', label: '首次升级为 PB 的日期', type: PARAM_TYPE.DATE, dateFormat: 'YYYY-MM' },
      { key: 'isPbActivityWhitelisted', label: 'PB 活动参与白名单', type: PARAM_TYPE.BOOLEAN }
    ]
  },
  {
    key: 'crossBorder',
    label: '跨境资格（1+1）',
    params: [
      { key: 'isCrossBorderHK', label: '是否为 1+1 CN-HK 双边客户', type: PARAM_TYPE.BOOLEAN },
      { key: 'isCrossBorderSG', label: '是否为 1+1 CN-SG 双边客户', type: PARAM_TYPE.BOOLEAN },
      { key: 'isHKQualifier', label: '是否为 HK qualifier', type: PARAM_TYPE.BOOLEAN },
      { key: 'cnHkQualifierDate', label: 'New to 1+1 CN-HK qualifier 时间', type: PARAM_TYPE.DATE, dateFormat: 'YYYY-MM' },
      { key: 'isSGQualifier', label: '是否为 SG qualifier', type: PARAM_TYPE.BOOLEAN },
      { key: 'cnSgQualifierDate', label: 'New to 1+1 CN-SG qualifier 时间', type: PARAM_TYPE.DATE, dateFormat: 'YYYY-MM' }
    ]
  },
  {
    key: 'mgm',
    label: 'MGM / 推荐关系',
    params: [
      { key: 'monthlySuccessfulReferrals', label: '某自然月成功推荐人数', type: PARAM_TYPE.LIST, listItemType: PARAM_TYPE.NUMBER, hasHistory: true },
      { key: 'yearlySuccessfulReferrals', label: '某自然年成功推荐人数', type: PARAM_TYPE.LIST, listItemType: PARAM_TYPE.NUMBER, hasHistory: true },
      { key: 'isReferredAndQualified', label: '是否被成功推荐来开户且达标', type: PARAM_TYPE.BOOLEAN },
      { key: 'mgmCaseId', label: 'MGM case ID', type: PARAM_TYPE.STRING },
      { key: 'monthlyReferrals', label: '某自然月推荐人数', type: PARAM_TYPE.LIST, listItemType: PARAM_TYPE.NUMBER, hasHistory: true },
      { key: 'yearlyReferrals', label: '某自然年推荐人数', type: PARAM_TYPE.LIST, listItemType: PARAM_TYPE.NUMBER, hasHistory: true },
      { key: 'referralRelation', label: '推荐关系', type: PARAM_TYPE.REFERRAL, desc: '被推荐人客户号列表' }
    ]
  },
  {
    key: 'rpq',
    label: '投资偏好',
    params: [
      { key: 'validRpq', label: '客户持有 valid RPQ 等级', type: PARAM_TYPE.STRING, options: ENUMS.validRpq },
      { key: 'prospectsNeeds', label: 'Prospects Needs', type: PARAM_TYPE.BOOLEAN }
    ]
  },
  {
    key: 'behavior',
    label: '行为与触点',
    params: [
      { key: 'isHsbcWechatLinked', label: '是否关注"汇丰中国客户服务"微信服务号且绑定银行账户', type: PARAM_TYPE.BOOLEAN },
      { key: 'isPrevMonthInactiveCurMonthActive', label: '上个自然月未登录、当前自然月登录过手机银行 1 天或以上', type: PARAM_TYPE.BOOLEAN },
      { key: 'isPrevTwoMonthsActive', label: '从当前自然月起前序连续 2 个完整月是否登录手机银行', type: PARAM_TYPE.BOOLEAN },
      { key: 'isRmWeComBound', label: '是否绑定 RM 企业微信', type: PARAM_TYPE.BOOLEAN },
      { key: 'firstBiometricLogin', label: '是否首次使用 Face ID 或指纹登录手机银行', type: PARAM_TYPE.BOOLEAN },
      { key: 'isSimulatedAllocationCompleted', label: '成功完成模拟资产配置的客户', type: PARAM_TYPE.BOOLEAN }
    ]
  }
]

// 扁平参数字典：key -> param
export const PARAM_MAP = (() => {
  const map = {}
  PARAM_GROUPS.forEach((group) => {
    group.params.forEach((p) => {
      map[p.key] = { ...p, groupKey: group.key, groupLabel: group.label }
    })
  })
  return map
})()

// 根据参数推导可用运算符
export function getOperatorsByParam(param) {
  if (!param) return []
  switch (param.type) {
    case PARAM_TYPE.STRING:
      return param.options ? OPERATORS.STRING_ENUM : OPERATORS.STRING_TEXT
    case PARAM_TYPE.NUMBER:
      return OPERATORS.NUMBER
    case PARAM_TYPE.BOOLEAN:
      return OPERATORS.BOOLEAN
    case PARAM_TYPE.DATE:
      return OPERATORS.DATE
    case PARAM_TYPE.LIST:
      // List 先聚合再判断，聚合后以数值运算符为主
      return OPERATORS.NUMBER
    case PARAM_TYPE.REFERRAL:
      // 推荐关系：1. 列表长度（数值） 2. 是否包含指定客户号
      return [
        { value: 'lengthEq', label: '推荐人数 =' },
        { value: 'lengthGte', label: '推荐人数 ≥' },
        { value: 'lengthLte', label: '推荐人数 ≤' },
        { value: 'includesCustomerId', label: '包含客户号' },
        { value: 'notIncludesCustomerId', label: '不包含客户号' }
      ]
    default:
      return []
  }
}

// 是否需要展示时间窗口
export function needTimeWindow(param) {
  return !!(param && param.hasHistory)
}

// 是否需要填写比较值
export function needValueInput(operator) {
  return !['isNull', 'isNotNull'].includes(operator)
}

// 布尔值下拉选项
export const BOOLEAN_OPTIONS = [
  { value: true, label: '真' },
  { value: false, label: '假' }
]

// 是否是区间运算符
export function isBetweenOperator(operator) {
  return operator === 'between'
}

// 是否是多值运算符
export function isMultiValueOperator(operator) {
  return ['in', 'notIn'].includes(operator)
}
