const varyColor = require('webpack-theme-color-replacer/client/varyColor') // 用于生成主题色
const {generate} =  require('@ant-design/colors') // 用于生成 ant design 色系
const {ADMIN, ANTD} = require('../config/default') // 用于获取 ant design 色系
const Config = require('../config') // 用于获取配置
// 获取主题色

const themeMode = ADMIN.theme.mode // 主题模式

// 获取 ant design 色系
function getAntdColors(color, mode) { // color: 主题色 mode: 主题模式
  let options = mode && (mode == themeMode.NIGHT) ? {theme: 'dark'} : undefined // ant design 色系配置
  return generate(color, options) // 生成 ant design 色系
}

// 获取功能性颜色
function getFunctionalColors(mode) {
  let options = mode && (mode == themeMode.NIGHT) ? {theme: 'dark'} : undefined // ant design 色系配置
  let {success, warning, error} = ANTD.primary // 获取 ant design 色系
  const  {success: s1, warning: w1, error: e1} = Config.theme // 获取配置
  success = success && s1 // 合并成功配置
  warning = success && w1 // 合并警告配置
  error = success && e1 // 合并错误配置
  const successColors = generate(success, options) // 生成成功色系
  const warningColors = generate(warning, options) // 生成警告色系
  const errorColors = generate(error, options) // 生成错误色系
  return {
    success: successColors, // 成功色系
    warning: warningColors, // 警告色系
    error: errorColors // 错误色系
  }
}

// 获取菜单色系
function getMenuColors(color, mode) { // color: 主题色 mode: 主题模式
  if (mode == themeMode.NIGHT) {
    return ANTD.primary.night.menuColors
  } else if (color == ANTD.primary.color) {
    return ANTD.primary.dark.menuColors
  } else {
    return [varyColor.darken(color, 0.93), varyColor.darken(color, 0.83), varyColor.darken(color, 0.73)]
  }
}

// 获取主题模式切换色系
function getThemeToggleColors(color, mode) {
  //主色系
  const mainColors = getAntdColors(color, mode)
  const primary = mainColors[5]
  //辅助色系，因为 antd 目前没针对夜间模式设计，所以增加辅助色系以保证夜间模式的正常切换
  const subColors = getAntdColors(primary, themeMode.LIGHT)
  //菜单色系
  const menuColors = getMenuColors(color, mode)
  //内容色系（包含背景色、文字颜色等）
  const themeCfg = ANTD.theme[mode]
  let contentColors = Object.keys(themeCfg) 
    .map(key => themeCfg[key])
    .map(color => isHex(color) ? color : toNum3(color).join(','))
  // 内容色去重
  contentColors = [...new Set(contentColors)]
  // rgb 格式的主题色
  let rgbColors = [toNum3(primary).join(',')]
  let functionalColors = getFunctionalColors(mode)
  return {primary, mainColors, subColors, menuColors, contentColors, rgbColors, functionalColors}
}

function toNum3(color) { // 将颜色转换为 rgb 格式
  if (isHex(color)) { // hex 格式
    return varyColor.toNum3(color) // 转换为 rgb 格式
  }
  let colorStr = ''
  if (isRgb(color)) { 
    colorStr = color.slice(5, color.length)
  } else if (isRgba(color)) {
    colorStr = color.slice(6, color.lastIndexOf(','))
  }
  let rgb = colorStr.split(',')
  const r = parseInt(rgb[0])
  const g = parseInt(rgb[1])
  const b = parseInt(rgb[2])
  return [r, g, b]
}

function isHex(color) { // 判断是否为 hex 格式
  return color.length >= 4 && color[0] == '#'
}

function isRgb(color) { // 判断是否为 rgb 格式
  return color.length >= 10 && color.slice(0, 3) == 'rgb'
}

function isRgba(color) { // 判断是否为 rgba 格式
  return color.length >= 13 && color.slice(0, 4) == 'rgba'
}

module.exports = {
  isHex,
  isRgb,
  isRgba,
  toNum3,
  getAntdColors,
  getMenuColors,
  getThemeToggleColors,
  getFunctionalColors
}
