import type {
  DefaultOptionType,
  FieldNames,
  InternalFieldNames,
  SingleValueType,
} from '../Cascader'

export const VALUE_SPLIT = '__RC_CASCADER_SPLIT__'
export const SHOW_PARENT = 'SHOW_PARENT'
export const SHOW_CHILD = 'SHOW_CHILD'

export function toPathKey(value: SingleValueType) {
  return value.join(VALUE_SPLIT)
}

export function toPathKeys(value: SingleValueType[]) {
  return value.map(toPathKey)
}

export function toPathValueStr(pathKey: string) {
  return pathKey.split(VALUE_SPLIT)
}

export function fillFieldNames(fieldNames?: FieldNames): InternalFieldNames {
  const { label, value, children } = fieldNames || {}
  const val = value || 'value'
  return {
    label: label || 'label',
    value: val,
    key: val,
    children: children || 'children',
  }
}

export function isLeaf(option: DefaultOptionType, fieldNames: FieldNames) {
  return option.isLeaf ?? !option[fieldNames.children]?.length
}

export function scrollIntoParentView(element: HTMLElement) {
  const parent = element.parentElement
  if (!parent) {
    return
  }

  const elementToParent = element.offsetTop - parent.offsetTop // offsetParent may not be parent.
  if (elementToParent - parent.scrollTop < 0) {
    parent.scrollTo({ top: elementToParent })
  } else if (elementToParent + element.offsetHeight - parent.scrollTop > parent.offsetHeight) {
    parent.scrollTo({ top: elementToParent + element.offsetHeight - parent.offsetHeight })
  }
}
