export const sanitize = s => s.replace(/\.|,|:|;|\)|\(|"|'/g, '').toLowerCase();

export const createWordList = (words, searchTerm, size) => {
    // sanitize words and remove short strings
    words = words.map(w => sanitize(w)).filter(w => w.length > 1);

    // Add word combinations [n, n+1]
    for (let i = 0, len = words.length - 1; i < len; i++) {
        words.push(words[i] + '_' + words[i + 1]);
    }

    // Filter by searchTerm
    if (searchTerm) {
        const searchTerms = searchTerm
            .toLowerCase()
            .trimLeft()
            .trimRight()
            .split(' ');
        words = words.filter(w => searchTerms.some(s => w.indexOf(s) !== -1));
    }

    // Build word index
    const wordIndex = {};

    words.forEach(w => {
        if (!(w in wordIndex)) {
            wordIndex[w] = 1;
        } else {
            wordIndex[w] = wordIndex[w] + 1;
        }
    });

    // generate items from index
    const items = Object.keys(wordIndex)
        // filter out combined words that have only score 1
        .filter(w => wordIndex[w] > 1 || w.indexOf('_') == -1)
        .map(w => ({
            id: w,
            label: w,
            score: wordIndex[w],
            size: 1
        }))
        .sort((a, b) => (a.score == b.score ? 0 : b.score - a.score))
        // Optimization: As filtering the stopwords is quite heavy:
        // 1. first slice to required size + length of stop words set
        .slice(0, size + DutchStopWords.length)
        // 2. exclude stopwords
        .filter(item => {
            // single word in stopwords
            if (DutchStopWords.includes(item.id)) {
                return false;
            }

            // combined word
            if (item.id.indexOf('_') !== -1) {
                const parts = item.id.split('_');
                for (let i = 0, len = parts.length; i < len; i++) {
                    if (DutchStopWords.includes(parts[i])) {
                        return false;
                    }
                }
            }
            return true;
        })
        // 3. slice again to get required size
        .slice(0, size);

    // get max score
    let maxScore = items.reduce(
        (maxScore, item) => (item.score > maxScore ? item.score : maxScore),
        0
    );

    // calculate sqrt normalized size
    items.forEach(item => {
        item.size = Math.sqrt(item.score / maxScore);
    });

    return items;
};

// copy/adapted from https://github.com/stopwords-iso/stopwords-nl/blob/master/stopwords-nl.json
export const DutchStopWords = [
    'aan',
    'aangaande',
    'aangezien',
    'achte',
    'achter',
    'achterna',
    'af',
    'afgelopen',
    'al',
    'aldaar',
    'aldus',
    'alhoewel',
    'alias',
    'alle',
    'allebei',
    'alleen',
    'alles',
    'als',
    'alsnog',
    'altijd',
    'altoos',
    'ander',
    'andere',
    'anders',
    'anderszins',
    'beetje',
    'behalve',
    'behoudens',
    'beide',
    'beiden',
    'ben',
    'beneden',
    'bent',
    'bepaald',
    'betreffende',
    'bij',
    'bijna',
    'bijv',
    'binnen',
    'binnenin',
    'blijkbaar',
    'blijken',
    'boven',
    'bovenal',
    'bovendien',
    'bovengenoemd',
    'bovenstaand',
    'bovenvermeld',
    'buiten',
    'bv',
    'daar',
    'daardoor',
    'daarheen',
    'daarin',
    'daarna',
    'daarnet',
    'daarom',
    'daarop',
    'daaruit',
    'daarvanlangs',
    'dan',
    'dat',
    'de',
    'deden',
    'deed',
    'der',
    'derde',
    'derhalve',
    'dertig',
    'deze',
    'dhr',
    'die',
    'dikwijls',
    'dit',
    'doch',
    'doe',
    'doen',
    'doet',
    'door',
    'doorgaand',
    'drie',
    'duizend',
    'dus',
    'echter',
    'een',
    'eens',
    'eer',
    'eerdat',
    'eerder',
    'eerlang',
    'eerst',
    'eerste',
    'eigen',
    'eigenlijk',
    'elk',
    'elke',
    'en',
    'enig',
    'enige',
    'enigszins',
    'enkel',
    'er',
    'erdoor',
    'erg',
    'ergens',
    'etc',
    'etcetera',
    'even',
    'eveneens',
    'evenwel',
    'gauw',
    'ge',
    'gedurende',
    'geen',
    'gehad',
    'gekund',
    'geleden',
    'gelijk',
    'gemoeten',
    'gemogen',
    'genoeg',
    'geweest',
    'gewoon',
    'gewoonweg',
    'haar',
    'haarzelf',
    'had',
    'hadden',
    'hare',
    'heb',
    'hebben',
    'hebt',
    'hedden',
    'heeft',
    'heel',
    'hem',
    'hemzelf',
    'hen',
    'het',
    'hetzelfde',
    'hier',
    'hierbeneden',
    'hierboven',
    'hierin',
    'hierna',
    'hierom',
    'hij',
    'hijzelf',
    'hoe',
    'hoewel',
    'honderd',
    'hun',
    'hunne',
    'ieder',
    'iedere',
    'iedereen',
    'iemand',
    'iets',
    'ik',
    'ikzelf',
    'in',
    'inderdaad',
    'inmiddels',
    'intussen',
    'inzake',
    'is',
    'ja',
    'je',
    'jezelf',
    'jij',
    'jijzelf',
    'jou',
    'jouw',
    'jouwe',
    'juist',
    'jullie',
    'kan',
    'klaar',
    'kon',
    'konden',
    'krachtens',
    'kun',
    'kunnen',
    'kunt',
    'laatst',
    'later',
    'liever',
    'lijken',
    'lijkt',
    'maak',
    'maakt',
    'maakte',
    'maakten',
    'maar',
    'mag',
    'maken',
    'me',
    'meer',
    'meest',
    'meestal',
    'men',
    'met',
    'mevr',
    'mezelf',
    'mij',
    'mijn',
    'mijnent',
    'mijner',
    'mijzelf',
    'minder',
    'miss',
    'misschien',
    'missen',
    'mits',
    'mocht',
    'mochten',
    'moest',
    'moesten',
    'moet',
    'moeten',
    'mogen',
    'mr',
    'mrs',
    'mw',
    'na',
    'naar',
    'nadat',
    'nam',
    'namelijk',
    'nee',
    'neem',
    'negen',
    'nemen',
    'nergens',
    'net',
    'niemand',
    'niet',
    'niets',
    'niks',
    'noch',
    'nochtans',
    'nog',
    'nogal',
    'nooit',
    'nu',
    'nv',
    'of',
    'ofschoon',
    'om',
    'omdat',
    'omhoog',
    'omlaag',
    'omstreeks',
    'omtrent',
    'omver',
    'ondanks',
    'onder',
    'ondertussen',
    'ongeveer',
    'ons',
    'onszelf',
    'onze',
    'onzeker',
    'ooit',
    'ook',
    'op',
    'opnieuw',
    'opzij',
    'over',
    'overal',
    'overeind',
    'overige',
    'overigens',
    'paar',
    'pas',
    'per',
    'precies',
    'recent',
    'redelijk',
    'reeds',
    'rond',
    'rondom',
    'samen',
    'sedert',
    'sinds',
    'sindsdien',
    'slechts',
    'sommige',
    'spoedig',
    'steeds',
    'tamelijk',
    'te',
    'tegen',
    'tegenover',
    'tenzij',
    'terwijl',
    'thans',
    'tien',
    'tiende',
    'tijdens',
    'tja',
    'toch',
    'toe',
    'toen',
    'toenmaals',
    'toenmalig',
    'tot',
    'totdat',
    'tussen',
    'twee',
    'tweede',
    'u',
    'uit',
    'uitgezonderd',
    'uw',
    'vaak',
    'vaakwat',
    'van',
    'vanaf',
    'vandaan',
    'vanuit',
    'vanwege',
    'veel',
    'veeleer',
    'veertig',
    'verder',
    'verscheidene',
    'verschillende',
    'vervolgens',
    'via',
    'vier',
    'vierde',
    'vijf',
    'vijfde',
    'vijftig',
    'vol',
    'volgend',
    'volgens',
    'voor',
    'vooraf',
    'vooral',
    'vooralsnog',
    'voorbij',
    'voordat',
    'voordezen',
    'voordien',
    'voorheen',
    'voorop',
    'voorts',
    'vooruit',
    'vrij',
    'vroeg',
    'waar',
    'waarom',
    'waarschijnlijk',
    'wanneer',
    'want',
    'waren',
    'was',
    'wat',
    'we',
    'wederom',
    'weer',
    'weg',
    'wegens',
    'weinig',
    'wel',
    'weldra',
    'welk',
    'welke',
    'werd',
    'werden',
    'werder',
    'wezen',
    'whatever',
    'wie',
    'wiens',
    'wier',
    'wij',
    'wijzelf',
    'wil',
    'wilden',
    'willen',
    'word',
    'worden',
    'wordt',
    'zal',
    'ze',
    'zei',
    'zeker',
    'zelf',
    'zelfde',
    'zelfs',
    'zes',
    'zeven',
    'zich',
    'zichzelf',
    'zij',
    'zijn',
    'zijne',
    'zijzelf',
    'zo',
    'zoals',
    'zodat',
    'zodra',
    'zonder',
    'zou',
    'zouden',
    'zowat',
    'zulk',
    'zulke',
    'zullen',
    'zult',

    // additions
    "z'n",
    'één',
    "d'r",
    'nou',
    'mmm',
    'hè',
    'ie',
    'oh',
    'dr',
    'zn'
];
