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

//  enigma-bbs
const { MenuModule, MenuFlags } = require('./menu_module.js');
const { getSortedAvailableFileAreas } = require('./file_base_area.js');
const StatLog = require('./stat_log.js');
const SysProps = require('./system_property.js');

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

exports.moduleInfo = {
    name: 'File Area Selector',
    desc: 'Select from available file areas',
    author: 'NuSkooler',
};

const MciViewIds = {
    areaList: 1,
};

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

        this.setMergedFlag(MenuFlags.NoHistory);

        this.menuMethods = {
            selectArea: (formData, extraArgs, cb) => {
                const filterCriteria = {
                    areaTag: formData.value.areaTag,
                };

                const menuOpts = {
                    extraArgs: {
                        filterCriteria: filterCriteria,
                    },
                    menuFlags: [ MenuFlags.NoHistory ],
                };

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

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

            const self = this;

            async.waterfall(
                [
                    function mergeAreaStats(callback) {
                        const areaStats = StatLog.getSystemStat(
                            SysProps.FileBaseAreaStats
                        ) || { areas: {} };

                        //  we could use 'sort' alone, but area/conf sorting has some special properties; user can still override
                        const availAreas = getSortedAvailableFileAreas(self.client);
                        availAreas.forEach(area => {
                            const stats = areaStats.areas[area.areaTag];
                            area.totalFiles = stats ? stats.files : 0;
                            area.totalBytes = stats ? stats.bytes : 0;
                        });

                        return callback(null, availAreas);
                    },
                    function prepView(availAreas, callback) {
                        self.prepViewController(
                            'allViews',
                            0,
                            mciData.menu,
                            (err, vc) => {
                                if (err) {
                                    return callback(err);
                                }

                                const areaListView = vc.getView(MciViewIds.areaList);
                                areaListView.setItems(
                                    availAreas.map(area =>
                                        Object.assign(area, {
                                            text: area.name,
                                            data: area.areaTag,
                                        })
                                    )
                                );
                                areaListView.redraw();

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