/* jslint node: true */
'use strict';

//  ENiGMA½
const MenuModule = require('./menu_module.js').MenuModule;
const ViewController = require('./view_controller.js').ViewController;
const getSortedAvailableFileAreas =
    require('./file_base_area.js').getSortedAvailableFileAreas;
const FileBaseFilters = require('./file_base_filter.js');

//  deps
const async = require('async');

exports.moduleInfo = {
    name: 'File Base Search',
    desc: 'Module for quickly searching the file base',
    author: 'NuSkooler',
};

const MciViewIds = {
    search: {
        searchTerms: 1,
        search: 2,
        tags: 3,
        area: 4,
        orderBy: 5,
        sort: 6,
        advSearch: 7,
    },
};

exports.getModule = class FileBaseSearch extends MenuModule {
    constructor(options) {
        super(options);

        this.menuMethods = {
            search: (formData, extraArgs, cb) => {
                const isAdvanced = formData.submitId === MciViewIds.search.advSearch;
                return this.searchNow(formData, isAdvanced, cb);
            },
        };
    }

    mciReady(mciData, cb) {
        super.mciReady(mciData, err => {
            if (err) {
                return cb(err);
            }

            const self = this;
            const vc = self.addViewController(
                'search',
                new ViewController({ client: this.client })
            );

            async.series(
                [
                    function loadFromConfig(callback) {
                        return vc.loadFromMenuConfig(
                            { callingMenu: self, mciMap: mciData.menu },
                            callback
                        );
                    },
                    function populateAreas(callback) {
                        self.availAreas = [{ name: '-ALL-' }].concat(
                            getSortedAvailableFileAreas(self.client) || []
                        );

                        const areasView = vc.getView(MciViewIds.search.area);
                        areasView.setItems(self.availAreas.map(a => a.name));
                        areasView.redraw();
                        vc.switchFocus(MciViewIds.search.searchTerms);

                        return callback(null);
                    },
                ],
                err => {
                    return cb(err);
                }
            );
        });
    }

    getSelectedAreaTag(index) {
        if (0 === index) {
            return ''; //  -ALL-
        }
        const area = this.availAreas[index];
        if (!area) {
            return '';
        }
        return area.areaTag;
    }

    getOrderBy(index) {
        return FileBaseFilters.OrderByValues[index] || FileBaseFilters.OrderByValues[0];
    }

    getSortBy(index) {
        return FileBaseFilters.SortByValues[index] || FileBaseFilters.SortByValues[0];
    }

    getFilterValuesFromFormData(formData, isAdvanced) {
        const areaIndex = isAdvanced ? formData.value.areaIndex : 0;
        const orderByIndex = isAdvanced ? formData.value.orderByIndex : 0;
        const sortByIndex = isAdvanced ? formData.value.sortByIndex : 0;

        return {
            areaTag: this.getSelectedAreaTag(areaIndex),
            terms: formData.value.searchTerms,
            tags: isAdvanced ? formData.value.tags : '',
            order: this.getOrderBy(orderByIndex),
            sort: this.getSortBy(sortByIndex),
        };
    }

    searchNow(formData, isAdvanced, cb) {
        const filterCriteria = this.getFilterValuesFromFormData(formData, isAdvanced);

        const menuOpts = {
            extraArgs: {
                filterCriteria: filterCriteria,
            },
        };

        return this.gotoMenu(
            this.menuConfig.config.fileBaseListEntriesMenu || 'fileBaseListEntries',
            menuOpts,
            cb
        );
    }
};
