import toHash from 'tohash'

export const THEMES_ARRAY = [
  {
    id: '3024-night',
    name: '3024 Night'
  },
  {
    id: 'ambiance',
    name: 'Ambiance'
  },
  {
    id: 'blackboard',
    name: 'Blackboard'
  },
  {
    id: 'cobalt',
    name: 'Cobalt'
  },
  {
    id: 'dracula',
    name: 'Dracula'
  },
  {
    id: 'duotone-dark',
    name: 'Duotone'
  },
  {
    id: 'hopscotch',
    name: 'Hopscotch'
  },
  {
    id: 'material',
    name: 'Material'
  },
  {
    id: 'monokai',
    name: 'Monokai'
  },
  {
    id: 'panda-syntax',
    name: 'Panda'
  },
  {
    id: 'paraiso-dark',
    name: 'Paraiso'
  },
  {
    id: 'seti',
    name: 'Seti'
  },
  {
    id: 'solarized',
    name: 'Solarized'
  },
  {
    id: 'twilight',
    name: 'Twilight'
  },
  {
    id: 'yeti',
    name: 'Yeti'
  },
  {
    id: 'zenburn',
    name: 'Zenburn'
  }
]

export const THEMES = toHash(THEMES_ARRAY)

export const LANGUAGES = [
  {
    name: 'Auto',
    mode: 'auto'
  },
  {
    name: 'Plain Text'
  },
  {
    name: 'C',
    mode: 'clike'
  },
  {
    name: 'Clojure',
    mode: 'clojure'
  },
  {
    name: 'Cobol',
    mode: 'cobol'
  },
  {
    name: 'CoffeeScript',
    mode: 'coffeescript'
  },
  {
    name: 'Crystal',
    mode: 'crystal'
  },
  {
    name: 'CSS',
    mode: 'css'
  },
  {
    name: 'D',
    mode: 'd'
  },
  {
    name: 'Dart',
    mode: 'dart'
  },
  {
    name: 'Django',
    mode: 'django'
  },
  {
    name: 'Docker',
    mode: 'dockerfile'
  },
  {
    name: 'Elm',
    mode: 'elm'
  },
  {
    name: 'Erlang',
    mode: 'erlang'
  },
  {
    name: 'Fortran',
    mode: 'fortran'
  },
  {
    name: 'F# / OCaml',
    mode: 'mllike'
  },
  {
    name: 'Go',
    mode: 'go'
  },
  {
    name: 'Groovy',
    mode: 'groovy'
  },
  {
    name: 'Handlebars',
    mode: 'handlebars'
  },
  {
    name: 'Haskell',
    mode: 'haskell'
  },
  {
    name: 'Haxe',
    mode: 'haxe'
  },
  {
    name: 'HTML',
    mode: 'htmlmixed'
  },
  {
    name: 'JavaScript',
    mode: 'javascript'
  },
  {
    name: 'JSX',
    mode: 'jsx'
  },
  {
    name: 'Julia',
    mode: 'julia'
  },
  {
    name: 'Kotlin',
    mode: 'clike',
    mime: 'text/x-kotlin',
    short: 'kotlin'
  },
  {
    name: 'Lisp',
    mode: 'commonlisp'
  },
  {
    name: 'Lua',
    mode: 'lua'
  },
  {
    name: 'Markdown',
    mode: 'markdown'
  },
  {
    name: 'Mathematica',
    mode: 'mathematica'
  },
  {
    name: 'NGINX',
    mode: 'nginx'
  },
  {
    name: 'Nim',
    mode: 'nimrod',
    custom: true
  },
  {
    name: 'Pascal',
    mode: 'pascal'
  },
  {
    name: 'Perl',
    mode: 'perl'
  },
  {
    name: 'PHP',
    mode: 'php'
  },
  {
    name: 'Python',
    mode: 'python'
  },
  {
    name: 'R',
    mode: 'r'
  },
  {
    name: 'Ruby',
    mode: 'ruby'
  },
  {
    name: 'Rust',
    mode: 'rust'
  },
  {
    name: 'Sass',
    mode: 'sass'
  },
  {
    name: 'Scala',
    mode: 'clike'
  },
  {
    name: 'Smalltalk',
    mode: 'smalltalk'
  },
  {
    name: 'SQL',
    mode: 'sql'
  },
  {
    name: 'Swift',
    mode: 'swift'
  },
  {
    name: 'TCL',
    mode: 'tcl'
  },
  {
    name: 'VB.NET',
    mode: 'vb'
  },
  {
    name: 'Verilog',
    mode: 'verilog'
  },
  {
    name: 'VHDL',
    mode: 'vhdl'
  },
  {
    name: 'Vue',
    mode: 'vue'
  },
  {
    name: 'XML',
    mode: 'xml'
  },
  {
    name: 'YAML',
    mode: 'yaml'
  }
]

export const DEFAULT_LANGUAGE = 'auto'

export const COLORS = {
  BLACK: '#121212',
  PRIMARY: '#F8E81C',
  SECONDARY: '#fff',
  GRAY: '#858585'
}

export const DEFAULT_CODE = `const pluckDeep = key => obj => key.split('.').reduce((accum, key) => accum[key], obj)

const compose = (...fns) => res => fns.reduce((accum, next) => next(accum), res)

const unfold = (f, seed) => {
  const go = (f, seed, acc) => {
    const res = f(seed)
    return res ? go(f, res[1], acc.concat([res[0]])) : acc
  }
  return go(f, seed, [])
}`

if (typeof window !== 'undefined' && typeof window.navigator !== 'undefined') {
  const required = []

  LANGUAGES.filter(language => language.mode !== 'auto').forEach(language => {
    if (language.mode && required.indexOf(language.mode) === -1) {
      required.push(language.mode)
      !language.custom
        ? require(`codemirror/mode/${language.mode}/${language.mode}`)
        : require(`./customModes/${language.mode}`)
    }
  })
}

@@ -3963,21 +3963,33 @@
 nst 
-required = %5B%5D
+alreadyLoaded = new Set()
 %0A%0A  
@@ -4094,24 +4094,26 @@
  && 
-required.indexOf
+!alreadyLoaded.has
 (lan
@@ -4127,15 +4127,8 @@
 ode)
- === -1
 ) %7B%0A
@@ -4137,21 +4137,25 @@
     
-required.push
+alreadyLoaded.add
 (lan
@@ -4172,17 +4172,16 @@
 )%0A      
-!
 language
@@ -4211,40 +4211,21 @@
 re(%60
-codemirror/mode/$%7Blanguage.mode%7D
+./customModes
 /$%7Bl
@@ -4255,37 +4255,56 @@
  : require(%60
-./customModes
+codemirror/mode/$%7Blanguage.mode%7D
 /$%7Blanguage.

use set lookup to keep track of loaded modes