import { ReactScopeValueStore } from '@/features/ide-react/scope-value-store/react-scope-value-store'
import customLocalStorage from '@/infrastructure/local-storage'
import getMeta from '@/utils/meta'

export function populateEditorScope(
  store: ReactScopeValueStore,
  projectId: string
) {
  // This value is not used in the React code. It's just here to prevent errors
  // from EditorProvider
  store.set('state.loading', false)

  store.set('project.name', null)

  store.set('editor', {
    showSymbolPalette: false,
    toggleSymbolPalette: () => {},
    sharejs_doc: null,
    open_doc_id: null,
    open_doc_name: null,
    opening: true,
    trackChanges: false,
    wantTrackChanges: false,
    // No Ace here
    newSourceEditor: true,
    error_state: false,
  })
  store.persisted(
    'editor.showVisual',
    getMeta('ol-usedLatex') === 'never' || showVisualFallbackValue(projectId),
    `editor.lastUsedMode`,
    {
      toPersisted: showVisual => (showVisual ? 'visual' : 'code'),
      fromPersisted: mode => mode === 'visual',
    }
  )

  store.persisted(
    'editor.codeEditorOpened',
    codeEditorOpenedFallbackValue(),
    'editor.codeEditorOpened'
  )
  store.watch('editor.showVisual', showVisual => {
    if (store.get('editor.codeEditorOpened') !== true && showVisual === false) {
      store.set('editor.codeEditorOpened', true)
    }
  })
}

function showVisualFallbackValue(projectId: string) {
  const editorModeKey = `editor.mode.${projectId}`
  const editorModeVal = customLocalStorage.getItem(editorModeKey)

  if (editorModeVal) {
    // clean up the old key
    customLocalStorage.removeItem(editorModeKey)
  }

  return editorModeVal === 'rich-text'
}

function codeEditorOpenedFallbackValue() {
  const signUpDate = getMeta('ol-user').signUpDate
  if (
    typeof signUpDate === 'string' &&
    new Date(signUpDate) < new Date('2024-08-02')
  ) {
    // if signUpDate is before releasing "codeEditorOpened" value
    // it is assumed that the user has opened the code editor at some point
    return true
  }
  return false
}
