package com.github.qinyou.system.controller;

import com.github.qinyou.common.annotation.RequirePermission;
import com.github.qinyou.common.constant.Constant;
import com.github.qinyou.common.interceptor.ComActionInterceptor;
import com.github.qinyou.common.interceptor.PermissionInterceptor;
import com.github.qinyou.common.interceptor.SearchSql;
import com.github.qinyou.common.utils.Id.IdUtils;
import com.github.qinyou.common.utils.StringUtils;
import com.github.qinyou.common.utils.WebUtils;
import com.github.qinyou.common.validator.IdsRequired;
import com.github.qinyou.common.web.BaseController;
import com.github.qinyou.system.model.SysDict;
import com.github.qinyou.system.model.SysDictGroup;
import com.google.common.base.Objects;
import com.google.common.base.Preconditions;
import com.jfinal.aop.Before;
import com.jfinal.aop.Clear;
import com.jfinal.plugin.activerecord.Db;
import com.jfinal.plugin.activerecord.Page;

import java.util.Date;
import java.util.List;

/**
 * 数据字典
 *
 * @author zhangchuang
 */
@RequirePermission("sysDict")
public class SysDictController extends BaseController {

    /**
     * 菜单页
     */
    public void index() {
        render("system/sysDict.ftl");
    }


    /**
     * sysDictGroup datagrid
     */
    @Before(SearchSql.class)
    public void queryGroup() {
        int pageNumber = getAttr("pageNumber");
        int pageSize = getAttr("pageSize");
        String where = getAttr(Constant.SEARCH_SQL);
        Page<SysDictGroup> sysDictGroupPage = SysDictGroup.dao.page(pageNumber, pageSize, where);
        renderDatagrid(sysDictGroupPage);
    }


    /**
     * 新增或编辑sysDictGroup 弹窗
     */
    public void newGroupModel() {
        String id = getPara("id");
        if (StringUtils.notEmpty(id)) {
            SysDictGroup sysDictGroup = SysDictGroup.dao.findById(id);
            setAttr("sysDictGroup", sysDictGroup);
        }
        render("system/sysDictGroup_form.ftl");
    }


    /**
     * 增加 sysDictGroup
     */
    @SuppressWarnings("Duplicates")
    public void addGroupAction() {
        SysDictGroup sysDictGroup = getBean(SysDictGroup.class, "");
        sysDictGroup.setId(IdUtils.id());
        sysDictGroup.setCreater(WebUtils.getSessionUsername(this))
                .setCreateTime(new Date());
        if (sysDictGroup.save()) {
            renderSuccess(ADD_SUCCESS);
        } else {
            renderFail(ADD_FAIL);
        }
    }


    /**
     * 修改 sysDictGroup
     */
    public void updateGroupAction() {
        // 已存数据
        SysDictGroup sysDictGroupOld = SysDictGroup.dao.findById(get("id"));
        if (sysDictGroupOld == null) {
            renderSuccess(UPDATE_FAIL);
            return;
        }
        // 修改后的数据
        SysDictGroup sysDictGroup = getBean(SysDictGroup.class, "");
        sysDictGroup.setUpdater(WebUtils.getSessionUsername(this))
                .setUpdateTime(new Date());

        if (!Objects.equal(sysDictGroup.getGroupCode(), sysDictGroupOld.getGroupCode())) {
            // 编码不一致
            List<SysDict> sysDictList = SysDict.dao.findAllByGroupCode(sysDictGroupOld.getGroupCode());
            if (sysDictList.size() > 0) {
                // 子表存在记录
                Db.tx(() -> {
                    String sql = "update sys_dict set groupCode = ? where groupCode = ?";
                    Db.update(sql, sysDictGroup.getGroupCode(), sysDictGroupOld.getGroupCode());
                    sysDictGroup.update();
                    return true;
                });
            } else {
                // 子表 不存在记录
                sysDictGroup.update();
            }
        } else {
            sysDictGroup.update();
        }
        renderSuccess(UPDATE_SUCCESS);
    }


    /**
     * 删除 sysDictGroup
     */
    @Before(IdsRequired.class)
    public void deleteGroupAction() {
        // 设置删除标志
        String ids = getPara("ids").replaceAll(",", "','");
        Db.tx(() -> {
            String sql = "update sys_dict set delFlag = 'X' where groupCode in (select groupCode from sys_dict_group where id in ('" + ids + "'))";
            Db.update(sql);
            sql = "update sys_dict_group set delFlag = 'X' where id in ('" + ids + "')";
            Db.update(sql);
            return true;
        });
        renderSuccess(DELETE_SUCCESS);
    }


    /**
     * sysDict datagrid
     */
    @Before(SearchSql.class)
    public void queryDict() {
        int pageNumber = getAttr("pageNumber");
        int pageSize = getAttr("pageSize");
        String where = getAttr(Constant.SEARCH_SQL);
        Page<SysDict> sysDictPage = SysDict.dao.page(pageNumber, pageSize, where);
        renderDatagrid(sysDictPage);
    }


    /**
     * 新增或编辑 sysDict 弹窗
     */
    public void newDictModel() {
        String id = getPara("id");
        String groupCode;
        if (StringUtils.notEmpty(id)) {
            // 编辑页面
            SysDict sysDict = SysDict.dao.findById(id);
            setAttr("sysDict", sysDict);
            groupCode = sysDict.getGroupCode();
        } else {
            // 新增页面
            groupCode = getPara("groupCode");
        }
        Preconditions.checkNotNull(groupCode, "groupCode 参数不可为空");

        SysDictGroup sysDictGroup = SysDictGroup.dao.findByGroupCode(groupCode);
        if (sysDictGroup != null) {
            setAttr("groupName", sysDictGroup.getGroupName());
            setAttr("groupCode", sysDictGroup.getGroupCode());
        }
        render("system/sysDict_form.ftl");
    }


    /**
     * 增加 sysDict
     */
    public void addDictAction() {
        SysDict sysDict = getBean(SysDict.class, "");
        boolean flag = sysDict.setId(IdUtils.id())
                .setCreater(WebUtils.getSessionUsername(this))
                .setCreateTime(new Date())
                .save();
        if (flag) {
            renderSuccess(ADD_SUCCESS);
        } else {
            renderFail(ADD_FAIL);
        }
    }


    /**
     * 修改 sysDict
     */
    public void updateDictAction() {
        SysDict sysDict = getBean(SysDict.class, "");
        boolean flag = sysDict.setUpdater(WebUtils.getSessionUsername(this)).setUpdateTime(new Date()).update();
        if (flag) {
            renderSuccess(UPDATE_SUCCESS);
        } else {
            renderFail(UPDATE_FAIL);
        }
    }

    /**
     * 删除 sysDict
     */
    @Before(IdsRequired.class)
    public void deleteDictAction() {
        String ids = getPara("ids").replaceAll(",", "','");
        String sql = "update sys_dict set delFlag = 'X' where id in ('" + ids + "')";
        Db.update(sql);
        renderSuccess(DELETE_SUCCESS);
    }


    @Clear({PermissionInterceptor.class, ComActionInterceptor.class})
    public void combobox() {
        String groupCode = get("groupCode", "");
        renderJson(SysDict.dao.findListByGroupAndState(groupCode, "on"));
    }
}