import { createRef, RefObject, render } from 'preact'
import { forwardRef } from 'preact/compat'
import { Mindmap, MindmapProps } from './view/Mindmap'
import { defaultRoot, Model } from './model'
import { ViewModel } from './viewModel'
import { ThemeContext, defaultTheme } from './context/theme'
import { defaultLocale, LocaleContext } from './context/locale'
import { ContributionAPI } from './interface/contribute'
import { noop } from './utils/common'

const defaultProps: MindmapProps = {
  value: defaultRoot,
  theme: defaultTheme,
  locale: defaultLocale.locale,
  onChange: noop,
  contributions: [],
  layout: 'mindmap',
}

const MindmapApp = forwardRef(
  (props: Partial<MindmapProps>, ref: RefObject<ContributionAPI>) => {
    const {
      value = defaultProps.value,
      theme = defaultTheme,
      locale = defaultProps.locale,
    } = props
    return (
      <ViewModel.Provider>
        <Model.Provider
          initialState={{
            root: value,
          }}
        >
          <ThemeContext.Provider value={theme}>
            <LocaleContext.Provider value={{ locale }}>
              <Mindmap {...defaultProps} {...props} ref={ref} />
            </LocaleContext.Provider>
          </ThemeContext.Provider>
        </Model.Provider>
      </ViewModel.Provider>
    )
  },
)

function createMindmap(el: HTMLElement, options?: Partial<MindmapProps>) {
  const ref = createRef<ContributionAPI>()
  render(<MindmapApp ref={ref} {...options} />, el)
  return ref
}

export { createMindmap }