'use strict';

/**
 * 控制器基类
 *
 * @author CaiAoLin
 * @date 2017/10/11
 * @version
 */
const moment = require('moment');
const messageType = require('../const/message_type');
const Controller = require('egg').Controller;
const menuList = require('../../config/menu');
class BaseController extends Controller {

    /**
     * 构造函数
     *
     * @param {Object} ctx - egg全局context
     * @return {void}
     */
    constructor(ctx) {
        super(ctx);
        this.messageType = messageType;
        this.jsValidator = this.app.jsValidator;
        // 当前菜单
        ctx.menu = menuList[ctx.controllerName] === undefined ? {} : menuList[ctx.controllerName];
        ctx.title = ctx.menu === {} ? '' : ctx.menu.name;
        if (ctx.menu !== {} && ctx.menu.children !== null) {
            for (const index in ctx.menu.children) {
                if (index === ctx.actionName) {
                    ctx.title = ctx.menu.children[index].name;
                }
            }
        }
        // 菜单列表
        ctx.menuList = menuList;
        ctx.showProject = false;
        ctx.showTender = false;
        ctx.showTitle = false;
    }

    /**
     * 渲染layout
     *
     * @param {String} view - 渲染的view
     * @param {Object} data - 渲染的数据
     * @param {String} modal - 渲染的modal
     * @return {void}
     */
    async layout(view, data = {}, modal = '') {
        data.moment = moment;
        // 获取消息提示
        const message = this.ctx.session.message;
        // 取出后删除
        this.ctx.session.message = null;

        try {
            data.min = this.app.config.min ? '.min' : '';
            const viewString = await this.ctx.renderView(view, data);
            const modalString = modal === '' ? '' : await this.ctx.renderView(modal, data);
            const renderData = {
                min: this.app.config.min ? '.min' : '',
                content: viewString,
                message: JSON.stringify(message),
                modal: modalString,
                dropDownMenu: data.dropDownMenu === undefined ? [] : data.dropDownMenu,
                breadCrumb: data.breadCrumb === undefined ? '' : data.breadCrumb,
                tenderList: data.tenderList === undefined ? [] : data.tenderList,
            };
            await this.ctx.render('layout/layout.ejs', renderData);
        } catch(err) {
            console.log(err);
        }
    }

    /**
     * 设置提示
     *
     * @param {String} message - 提示信息
     * @param {String} type - 提示类型
     * @return {void}
     */
    setMessage(message, type) {
        let icon = '';
        switch (type) {
            case messageType.SUCCESS:
                icon = 'check';
                break;
            case messageType.ERROR:
                icon = 'exclamation-circle';
                break;
            case messageType.INFO:
                icon = 'info-circle';
                break;
            case messageType.WARNING:
                icon = 'warning';
                break;
            default:
                break;
        }
        this.ctx.session.message = {
            type,
            icon,
            message,
        };
    }
}

module.exports = BaseController;
