var Suggest = {

    macroCombinations(arr){

        console.log(arr);

        let allCombinations = [];

        let byRepeat = {};

        for(let i = 0; i < arr.length; i++){

            let combination = Suggest.combinations(arr[i]);

            combination.forEach((comb) => {

                if(!byRepeat[comb]) byRepeat[comb] = [];

                byRepeat[comb].push(arr[i]);

            });

            allCombinations.push(combination);

        }

        let macro = {};

        for(let i = 0; i < allCombinations.length; i++){

            let combination = allCombinations[i];

            let chosen = '';
            let combinationsCounts = {};

            for(let j = 0; j < combination.length; j++){

                let comb = combination[j];

                if(byRepeat[comb]) combinationsCounts[comb] = byRepeat[comb];

            }

            let max = 0;

            for(let comb in combinationsCounts){

                if(combinationsCounts[comb].length > max){

                    console.log('CUMBINAICHON', comb);

                    // Se só tiver letras, vamos ignorar
                    if(comb.match(/^[a-zA-Z]+$/)) continue;

                    max = combinationsCounts[comb].length;
                    chosen = comb;

                }

            }

            // Count how many values has the max
            let maxRepeat = Object.values(combinationsCounts).filter(v => v == max).length;

            // If there is more than one max, we will choose the one with the less words
            if(maxRepeat > 1){

                // @todo

            }

            macro[arr[i]] = chosen;

        }

        return macro;

    },

    // Diferente do tokenize, pois esse aqui é mais para identificar skus conjuntos em diferentes palavras
    combinations(frase){

        // frase = frase.normalize('NFD').replace(/[\u0300-\u036f]/g, "");

        // console.log(frase);

        // Vamos escolher entre - ou _, o que aparecer antes
        let separator = false;
        let combinations = [];

        if(frase.indexOf('-') != -1){

            separator = '-';

        } else if(frase.indexOf('_') != -1){

            separator = '_';

        }

        if(!separator) return [frase];

        let preWords = frase.split(separator);

        preWords.pop();

        while(preWords.length > 0){

            let words = preWords.join(separator);

            if(preWords.length == 1) words = preWords[0];

            combinations.push(words);

            preWords.pop();

        }

        return combinations;

    },

    tokenize(frase){

        frase = frase.normalize('NFD').replace(/[\u0300-\u036f]/g, "");

        let palavras = frase.split(' ');
        let combinacoes = [];
      
        for (let i = 0; i < palavras.length; i++) {
          for (let j = i; j < palavras.length; j++) {
            let combinacao = palavras.slice(i, j+1).join(' ');
            
            if (combinacao.split(' ').length <= 4) {
              combinacoes.push(combinacao);
            }
          }
        }
    
        combinacoes.sort((a, b) => {
            return b.length - a.length; 
        });
    
        let ret = combinacoes;

        ret = ret.map(r => r.toLowerCase());

        ret = ret.map(r => r.replaceAll(' ', '-'));

        return ret;

    },

    guess(selected, department){

        let childrenUrls = department.children.map(c => c.url);

        let names = selected.map(s => s.name);

        let childObjects = {};

        childrenUrls.forEach((url) => {

            let lastCategory = url.split('/').pop();

            childObjects[lastCategory] = [url];

            let tokenized = Suggest.tokenize(lastCategory.replaceAll('-', ' '));

            tokenized.forEach((token) => {  

                if(typeof childObjects[token] == 'undefined') childObjects[token] = [];

                childObjects[token].push(url);

            });

        });

        let suggestionsByLine = {};

        for(let i = 0; i < names.length; i++){

            let name = names[i];
            let id   = selected[i].id;

            let tokenized = Suggest.tokenize(name);

            for(let j = 0; j < tokenized.length; j++){

                let token = tokenized[j];

                if(token.length < 3) continue;

                if(childObjects[token]){

                    if(!suggestionsByLine[id]) suggestionsByLine[id] = [];

                    suggestionsByLine[id] = suggestionsByLine[id].concat(childObjects[token]);

                }

            }

        }

        for(let id in suggestionsByLine){

            suggestionsByLine[id] = Array.from(new Set(suggestionsByLine[id]));

        }

        return suggestionsByLine;

    },

    async getDepartments(){

        let selected = Approve.fetchSelected();

        if(selected.length == 0){

            return Alerts.ok(__('Selecione ao menos um produto'));

        }

        let loading1 = Styles.loading(__('Buscando departamentos'));

        return Api.post('/api/suggest/departments', {
            api: Apis.getApi(),
            selected: selected
        }).then((res) => {

            let suggestions = res.suggestions
            let deps        = res.departments;

            // console.log(suggestions);

            let suggestedDepartments = {};
            let suggestedCategories = [];

            suggestions.map(suggestion => {

                let categories = suggestion.categories;

                // Primeiras 3 categorias
                categories = categories.slice(0, 3);

                // Se não tiver categorias, pula

                if(categories.length == 0) return;

                suggestedCategories = suggestedCategories.concat(categories);

                categories.forEach(category => {

                    let department = category.split('/')[1];

                    if(!suggestedDepartments[department]) suggestedDepartments[department] = 0;

                    suggestedDepartments[department]++;

                });

            });

            deps.sort(function(a, b){

                return a.id - b.id;

            });

            deps.sort(function(a, b){

                let aPontuation = suggestedDepartments[a.url.substr(1)] || 0;
                let bPontuation = suggestedDepartments[b.url.substr(1)] || 0;

                return bPontuation - aPontuation;

            });

            loading1.remove();

            let depElm = $('<div class="suggest-categories-dep"></div>');

            depElm.append(__('Selecione um ou mais departamentos, para que possamos sugerir uma categoria para cada produto selecionado'));

            depElm.append('<br>');

            depElm.append('<div class="departments"></div>');

            let modal = Alerts.ok(__('Sugestor de categoria'), depElm.get(0).outerHTML);

            deps.forEach((dep) => {

                let departmentElm = $('<p>' + dep.name + '</p>');

                departmentElm.on('click', () => {

                    $(departmentElm).toggleClass('selected');

                });

                departmentElm.data('department', dep);

                $(modal).find('.departments').append(departmentElm);

            });

            $(modal).find('[value=ok]').on('click', () => {

                let selectedDep = $(modal).find('.departments .selected');

                if(selectedDep.length == 0){

                    Alerts.ok(__('Selecione ao menos um departamento'));

                    return;

                }

                let ids = [];
                let suggestedCats = [];

                selectedDep.each((i, elm) => {

                    let dep = $(elm).data('department');

                    // let guesses = Suggest.guess(selected, dep);

                    // console.log(guesses);

                    // suggestedCats = suggestedCats.concat(guesses);

                    ids.push(dep.id);

                });

                Api.post('/api/suggest/categories', {
                    api: Apis.getApi(),
                    ids: ids,
                    selected: selected,
                    suggested: JSON.stringify(suggestedCats),
                    pre_suggestions: suggestions
                });

            });

            return res;

        });

    },

    async category(){

        await Suggest.getDepartments();

    },

    async name(){

        let selected = Approve.fetchSelected();

        if(selected.length < 2){

            return Alerts.ok(__('Selecione ao menos 2 produtos'), __('O sugestor de nomes funciona melhor com agrupamentos de produtos similares'));

        }

        let modal = $(Alerts.blank(__('Compositor de nomes')));

        // let patterNameElm = $('<div class="name-pattern"></div>');

        let columns = [];

        modal.find('.modal-body').append('<div class="properties"></div>');

        let properties = [
            'Ajustar maiúsculas e minúsculas',
            'Ajustar acentuação',
            'Corrigir erros de digitação',
            'Remover palavras duplicadas',
            'Remover abreviações',
            // 'Maximo de 10 palavras',
            // 'Nomes mais criativos',
            // 'Até 60 caracteres',
            // 'Até 100 caracteres'
        ];

        properties.forEach((property) => {

            let propertyElm = $('<p><label><input type="checkbox" name="property" value="' + property + '"> ' + property + '</label></p>');

            modal.find('.properties').append(propertyElm);

        });

        // Lets create and append an button
        modal.find('.modal-body').after('<br><div class="modal-footer"><button type="button" class="name-enhance"><img src="/img/icons/enrichment.svg"> Melhorar</button></div>');
        // modal.find('.modal-body').after('<br><div class="modal-footer"><button type="button" class="name-enhance">Melhorar</button>&nbsp;&nbsp;<button type="button" class="name-revert">Reverter</button></div>');

        modal.find('.name-revert').on('click', () => {

            Api.post('/api/suggest/names/revert', {
                selected: selected,
                api: Apis.getApi()
            });

            modal.get(0).close();

        });

        modal.find('.name-enhance').on('click', () => {

            let properties = modal.find('[name=property]:checked').map((i, elm) => {

                return $(elm).val();

            }).get();

            if(properties.length == 0){

                Alerts.ok(__('Selecione ao menos uma propriedade'));

                return;

            }

            console.log(selected);

            Api.post('/api/suggest/names', {
                selected: selected,
                properties: properties,
                columns: columns,
                api: Apis.getApi()
            });

            modal.get(0).close();

        });

    },

    async images(){

        // Pega as linhas selecionadas, para que possamos enviar ao backend e o servidor
        // automaticamente irá associar as imagens e enviar o feedback pelo socket io, para a atualização
        // visual
        let selected = Approve.fetchSelected();

        if(selected.length == 0){

            return Alerts.ok(__('Selecione ao menos um produto'));

        }

        // Vamos perguntar se o usuário deseja remover as imagens atuais, com uma checkbox
        let msg = '<label><input type="checkbox" name="remove-images"> ' + __('Remover imagens atuais') + '</label>';

        let modal;

        Alerts.confirm(__('Deseja sugerir imagens em massa para os ') + selected.length + __(' produtos selecionados?'), msg, _modal => {

            modal = _modal;

        }).then(async (res) => {

            let removeImages = $(modal).find('[name=remove-images]').is(':checked');

            Api.post('/api/suggest/images', {
                selected: selected,
                api: Apis.getApi(),
                removeImages: removeImages
            });

        });

    }

}

$(function(){

    // Styles.view('Criando descrições', async (progressObj) => {

    //     console.log(progressObj);

    //     let progressElm = progressObj.progress;

    //     progressElm.find('.progress-body').html('<div class="progress-stop">Cancelar envio</div>');

    //     progressElm.find('.progress-stop').off('click');
    //     progressElm.find('.progress-stop').on('click', () => {

    //         Alerts.confirm('Tem certeza que deseja cancelar o envio?', 'Apenas serão cancelados os envios que ainda não foram processados').then(() => {

    //             let progressId = progressElm.attr('id');

    //             Api.post('/api/dashboard/stop-creation/' + progressId).then(() => {
    
    //                 Alerts.ok('Envio cancelado');
    
    //             });    

    //         });

    //     });

    // });

    Styles.view('Sugestor de imagens', async (progressObj) => {

        let progressElm = progressObj.progress;

        progressElm.find('.progress-body').html('<div class="progress-stop">Cancelar sugestão</div>');

        progressElm.find('.progress-stop').off('click');

        progressElm.find('.progress-stop').on('click', () => {

            Alerts.confirm(__('Tem certeza que deseja cancelar a sugestão?'), __('Apenas serão cancelados os envios que ainda não foram processados')).then(() => {

                Api.post('/api/suggest/images/stop/' + progressElm.attr('id')).then(() => {

                    Alerts.ok(__('Sugestão cancelada'));

                });

            });

        });

    });

    Styles.hook('Sugestor de imagens', (line) => {

        Approve.updateImages(line.id, line.images);

    });

    Styles.hook('Sugestor de nomes', (line) => {

        if(line.error){

            // let originalName = $('[data-uuid=' + line.id + ']').find('.name-item').text();

            // Turn the letter color red
            $('[data-uuid=' + line.id + ']').find('.name-item').css('color', 'red');

            // Helpers.type($('[data-uuid=' + line.id + ']').find('.name-item'), originalName + ' (Categoria não encontrada)', {
            //     delay: 40,
            //     startChar: '&nbsp;',
            // })

            return;

        }

        Helpers.type($('[data-uuid=' + line.id + ']').find('.name-item'), line.name, {
            delay: 40,
            startChar: '&nbsp;',
        });

        Approve.updateLocally(line.id, {
            name: line.name
        });

    });

    Styles.hook('Sugestor de categorias', (line) => {

        if(line.error){

            Helpers.type($('[data-uuid=' + line.id + ']').find('.category-item'), '(não encontrado)', {
                delay: 40,
                startChar: '&nbsp;',
            })

            return;

        }

        Helpers.type($('[data-uuid=' + line.id + ']').find('.category-item'), line.category.name, {
            delay: 40,
            startChar: '&nbsp;',
        })

    });

});