package com.yice.webadmin.app.model;

import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.yice.common.core.annotation.RelationDict;
import com.yice.common.core.annotation.RelationOneToMany;
import com.yice.common.core.annotation.RelationOneToManyAggregation;
import com.yice.common.core.base.mapper.BaseModelMapper;
import com.yice.common.core.base.model.BaseModel;
import com.yice.common.core.constant.AggregationType;
import com.yice.common.core.util.MyCommonUtil;
import com.yice.webadmin.app.vo.ModelManageVo;
import com.yice.webadmin.upms.model.SysUser;
import lombok.Data;
import lombok.EqualsAndHashCode;
import org.mapstruct.Mapper;
import org.mapstruct.Mapping;
import org.mapstruct.factory.Mappers;

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

/**
 * ModelManage实体对象。
 *
 * @author linking
 * @date 2023-04-13
 */
@Data
@EqualsAndHashCode(callSuper = true)
@TableName(value = "lmp_model_manage")
public class ModelManage extends BaseModel {

    /**
     * 模型ID。
     */
    @TableId(value = "model_id")
    private Long modelId;

    /**
     * 模型名称。
     */
    private String modelName;

    /**
     * 模型类型。
     */
    private Integer modelType;

    /**
     * 模型描述。
     */
    private String modelDescribe;

    /**
     * 版本数量。
     */
    /**
     * 版本数量 (一对多聚合计算字段)。
     */
    @RelationOneToManyAggregation(
            masterIdField = "modelId",
            slaveModelClass = ModelVersion.class,
            slaveIdField = "modelId",
            aggregationType = AggregationType.COUNT,
            aggregationField = "modelId")
    @TableField(exist = false)
    private Integer versionCount;

    /**
     * 业务标签。
     */
    private String businessLabel;

    /**
     * 是否为基础模型。
     */
    private Integer isBaseModel;

    /**
     * 最新版本来源。
     */
    private String lastVersionSource;

    /**
     * model_name / business_label LIKE搜索字符串。
     */
    @TableField(exist = false)
    private String searchString;

    /**
     * 创建人名称字典。
     */
    @RelationDict(
            masterIdField = "createUserId",
            slaveModelClass = SysUser.class,
            slaveIdField = "userId",
            slaveNameField = "showName")
    @TableField(exist = false)
    private Map<String, Object> createUserIdDictMap;

    public void setSearchString(String searchString) {
        this.searchString = MyCommonUtil.replaceSqlWildcard(searchString);
    }

    /**
     * ModelVersion 的一对多关联表数据对象。
     * 通常在一对多的关联中，我们基于从表数据过滤主表数据，此时需要先对从表数据进行嵌套子查询过滤，并将从表过滤数据列表集成到该字段。
     */
    @RelationOneToMany(
            masterIdField = "modelId",
            slaveModelClass = ModelVersion.class,
            slaveIdField = "modelId")
    @TableField(exist = false)
    private List<ModelVersion> modelVersionList;

    /**
     * ModelTask 的一对多关联表数据对象。
     * 通常在一对多的关联中，我们基于从表数据过滤主表数据，此时需要先对从表数据进行嵌套子查询过滤，并将从表过滤数据列表集成到该字段。
     */
    @RelationOneToMany(
            masterIdField = "modelId",
            slaveModelClass = ModelTask.class,
            slaveIdField = "modelId")
    @TableField(exist = false)
    private List<ModelTask> modelTaskList;

    /**
     * ModelDeploy 的一对多关联表数据对象。
     * 通常在一对多的关联中，我们基于从表数据过滤主表数据，此时需要先对从表数据进行嵌套子查询过滤，并将从表过滤数据列表集成到该字段。
     */
    @RelationOneToMany(
            masterIdField = "modelId",
            slaveModelClass = ModelDeploy.class,
            slaveIdField = "modelId")
    @TableField(exist = false)
    private List<ModelDeploy> modelDeployList;

    @Mapper
    public interface ModelManageModelMapper extends BaseModelMapper<ModelManageVo, ModelManage> {
        /**
         * 转换Vo对象到实体对象。
         *
         * @param modelManageVo 域对象。
         * @return 实体对象。
         */
        @Mapping(target = "modelVersionList", expression = "java(mapToBean(modelManageVo.getModelVersionList(), com.yice.webadmin.app.model.ModelVersion.class))")
        @Mapping(target = "modelTaskList", expression = "java(mapToBean(modelManageVo.getModelTaskList(), com.yice.webadmin.app.model.ModelTask.class))")
        @Mapping(target = "modelDeployList", expression = "java(mapToBean(modelManageVo.getModelDeployList(), com.yice.webadmin.app.model.ModelDeploy.class))")
        @Override
        ModelManage toModel(ModelManageVo modelManageVo);

        /**
         * 转换实体对象到VO对象。
         *
         * @param modelManage 实体对象。
         * @return 域对象。
         */
        @Mapping(target = "modelVersionList", expression = "java(beanToMap(modelManage.getModelVersionList(), false))")
        @Mapping(target = "modelTaskList", expression = "java(beanToMap(modelManage.getModelTaskList(), false))")
        @Mapping(target = "modelDeployList", expression = "java(beanToMap(modelManage.getModelDeployList(), false))")
        @Override
        ModelManageVo fromModel(ModelManage modelManage);
    }

    public static final ModelManageModelMapper INSTANCE = Mappers.getMapper(ModelManageModelMapper.class);
}
