/**
 * Copyright (c) 2022 - present TinyVue Authors.
 * Copyright (c) 2022 - present Huawei Cloud Computing Technologies Co., Ltd.
 *
 * Use of this source code is governed by an MIT-style license.
 *
 * THE OPEN SOURCE SOFTWARE IN THIS PRODUCT IS DISTRIBUTED IN THE HOPE THAT IT WILL BE USEFUL,
 * BUT WITHOUT ANY WARRANTY, WITHOUT EVEN THE IMPLIED WARRANTY OF MERCHANTABILITY OR FITNESS FOR
 * A PARTICULAR PURPOSE. SEE THE APPLICABLE LICENSES FOR MORE DETAILS.
 *
 */

import { set, isObject, merge } from '../deps/utils'

const isArr = Array.isArray

export default ({ options, extend }) => {
  if (!extend) {
    return
  }

  Object.keys(extend).forEach((key) => {
    const value = extend[key]

    if (~key.indexOf('.')) {
      set(options, key, value)
    } else if (typeof value === 'function') {
      options[key] = value(options[key])
    } else if (isArr(options[key]) && isArr(value)) {
      const attrList = [
        'series',
        'yAxis',
        'xAxis',
        'color',
        'dataZoom',
        'legend',
        'toolbox',
        'grid',
        'graphic',
        'timeline',
        'visualMap',
        'brush'
      ]
      if (~attrList.indexOf(key)) {
        options[key] = merge(options[key], value)
      }
    } else {
      if (isArr(options[key]) && isObject(options[key][0])) {
        options[key].forEach((option, i) => (options[key][i] = { ...option, ...value }))
      } else if (isObject(options[key])) {
        let optionBase = options[key]

        options[key] = { ...optionBase, ...value }
      } else {
        options[key] = value
      }
    }
  })
}