package cn.stylefeng.roses.kernel.system.integration.core.tag;

import cn.hutool.core.util.ObjectUtil;
import cn.hutool.extra.spring.SpringUtil;
import cn.stylefeng.roses.kernel.dict.modular.entity.SysDict;
import cn.stylefeng.roses.kernel.dict.modular.entity.SysDictType;
import cn.stylefeng.roses.kernel.dict.modular.service.DictService;
import cn.stylefeng.roses.kernel.dict.modular.service.DictTypeService;
import cn.stylefeng.roses.kernel.rule.enums.YesOrNotEnum;
import cn.stylefeng.roses.kernel.system.integration.core.consts.DictTagConstants;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import lombok.Data;
import lombok.EqualsAndHashCode;
import org.beetl.core.tag.GeneralVarTagBinding;

import java.util.List;
import java.util.Map;

/**
 * beetl字典标签基类
 *
 * @author liuhanqing
 * @since 2021/1/16 18:45
 */
@EqualsAndHashCode(callSuper = true)
@Data
public class SysDictBaseTag extends GeneralVarTagBinding {

    public DictService dictService = SpringUtil.getBean(DictService.class);

    public DictTypeService dictTypeService = SpringUtil.getBean(DictTypeService.class);

    /**
     * html组件 id
     */
    public String id;

    /**
     * html组件 name
     */
    public String name;

    /**
     * html组件 type
     */
    public String type;

    /**
     * 字典类型编码
     */
    public String dictTypeCode;

    /**
     * layui元素的风格
     */
    public String laySkin;

    /**
     * layui事件过滤器
     */
    public String layFilter;

    /**
     * layui校验
     */
    public String layVerify;

    /**
     * select控件提示name
     */
    public String headName;

    /**
     * select控件提示value
     */
    public String headValue;

    /**
     * select控件提示类型：：1-全部，2-请选择
     */
    public String headType;

    /**
     * 默认值
     */
    public String defaultValue;

    /**
     * 工作流相关
     */
    public String workflowForm;

    /**
     * 工作流相关
     */
    public String itemName;

    /**
     * 初始化绑定属性
     *
     * @author liuhanqing
     * @since 2021/1/16 23:49
     */
    public void initAttr() {
        Map<String, Object> attrs = this.getAttributes();
        if (attrs.size() > 0) {
            if (ObjectUtil.isNotNull(attrs.get(DictTagConstants.ID))) {
                this.setId(attrs.get(DictTagConstants.ID).toString());
            }
            if (ObjectUtil.isNotNull(attrs.get(DictTagConstants.NAME))) {
                this.setName(attrs.get(DictTagConstants.NAME).toString());
            }
            if (ObjectUtil.isNotNull(attrs.get(DictTagConstants.TYPE))) {
                this.setType(attrs.get(DictTagConstants.TYPE).toString());
            }
            if (ObjectUtil.isNotNull(attrs.get(DictTagConstants.DICT_TYPE_CODE))) {
                this.setDictTypeCode(attrs.get(DictTagConstants.DICT_TYPE_CODE).toString());
            }
            if (ObjectUtil.isNotNull(attrs.get(DictTagConstants.LAY_SKIN))) {
                this.setLaySkin(attrs.get(DictTagConstants.LAY_SKIN).toString());
            }
            if (ObjectUtil.isNotNull(attrs.get(DictTagConstants.LAY_FILTER))) {
                this.setLayFilter(attrs.get(DictTagConstants.LAY_FILTER).toString());
            }
            if (ObjectUtil.isNotNull(attrs.get(DictTagConstants.LAY_VERIFY))) {
                this.setLayVerify(attrs.get(DictTagConstants.LAY_VERIFY).toString());
            }
            if (ObjectUtil.isNotNull(attrs.get(DictTagConstants.HEAD_NAME))) {
                this.setHeadName(attrs.get(DictTagConstants.HEAD_NAME).toString());
            }
            if (ObjectUtil.isNotNull(attrs.get(DictTagConstants.HEAD_VALUE))) {
                this.setHeadValue(attrs.get(DictTagConstants.HEAD_VALUE).toString());
            }
            if (ObjectUtil.isNotNull(attrs.get(DictTagConstants.HEAD_TYPE))) {
                this.setHeadType(attrs.get(DictTagConstants.HEAD_TYPE).toString());
            }
            if (ObjectUtil.isNotNull(attrs.get(DictTagConstants.DEFAULT_VALUE))) {
                this.setDefaultValue(attrs.get(DictTagConstants.DEFAULT_VALUE).toString());
            }
            if (ObjectUtil.isNotNull(attrs.get(DictTagConstants.WORKFLOW_FORM))) {
                this.setWorkflowForm(attrs.get(DictTagConstants.WORKFLOW_FORM).toString());
            }
            if (ObjectUtil.isNotNull(attrs.get(DictTagConstants.ITEM_NAME))) {
                this.setItemName(attrs.get(DictTagConstants.ITEM_NAME).toString());
            }
        }
    }

    @Override
    public void render() {

    }

    /**
     * 获取字典类型
     *
     * @return 字典类型
     * @author liuhanqing
     * @since 2021/1/16 23:46
     */
    public SysDictType getDictType() {
        // 根据字典类型编码去查询字典类型
        LambdaQueryWrapper<SysDictType> dictTypeQueryWrapper = new LambdaQueryWrapper<>();
        dictTypeQueryWrapper.eq(SysDictType::getDictTypeCode, this.getDictTypeCode());
        dictTypeQueryWrapper.ne(SysDictType::getDelFlag, YesOrNotEnum.Y.getCode());
        return dictTypeService.getOne(dictTypeQueryWrapper);
    }

    /**
     * @return 根据字典类型返回字典集合
     * @author liuhanqing
     * @since 2021/1/16 23:46
     */
    public List<SysDict> getDictList() {
        // 查询字典列表
        LambdaQueryWrapper<SysDict> dictQueryWrapper = new LambdaQueryWrapper<>();
        dictQueryWrapper.eq(SysDict::getDictTypeCode, this.getDictTypeCode());
        dictQueryWrapper.ne(SysDict::getDelFlag, YesOrNotEnum.Y.getCode());
        dictQueryWrapper.orderByAsc(SysDict::getDictSort);
        return dictService.list(dictQueryWrapper);
    }
}
