import { StartTag } from '../token'
import { BS } from '../bs'

export type NameMap = string[] | { [name: string]: string }

export const AttributeMapper = (nameMap?: NameMap) => {
  if (!nameMap) {
    return (startTag: StartTag, object: any = {}) => {
      startTag.atts &&
        startTag.atts.forEach(att => {
          object[att.name.toString()] = att.value.toString()
        })
      return object
    }
  } else {
    const attributeMap = Array.isArray(nameMap)
      ? nameMap.reduce((attributeMap: { [name: string]: BS }, name: string) => {
          attributeMap[name] = BS.create(name)
          return attributeMap
        }, {})
      : Object.keys(nameMap).reduce((attributeMap: { [name: string]: BS }, name: string) => {
          attributeMap[name] = BS.create(nameMap[name])
          return attributeMap
        }, {})
    return (startTag: StartTag, object: any = {}) => {
      for (let name in attributeMap) {
        const value = startTag.getAttributeFQN(attributeMap[name])
        if (value) object[name] = value
      }
      return object
    }
  }
}
