package cn.iocoder.yudao.module.pms.util;

import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils;
import cn.iocoder.yudao.framework.common.util.collection.MapUtils;
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
import cn.iocoder.yudao.module.pms.controller.admin.vo.IotDeviceRespVO;
import cn.iocoder.yudao.module.pms.controller.admin.vo.IotDeviceSimpleRespVO;
import cn.iocoder.yudao.module.pms.dal.dataobject.IotDeviceDO;
import cn.iocoder.yudao.module.pms.enums.common.IotDeviceStatusEnum;
import cn.iocoder.yudao.module.system.controller.admin.dept.vo.dept.DeptSimpleRespVO;
import cn.iocoder.yudao.module.system.controller.admin.dept.vo.post.PostSimpleRespVO;
import cn.iocoder.yudao.module.system.controller.admin.permission.vo.role.RoleSimpleRespVO;
import cn.iocoder.yudao.module.system.controller.admin.user.vo.profile.UserProfileRespVO;
import cn.iocoder.yudao.module.system.controller.admin.user.vo.user.UserSimpleRespVO;
import cn.iocoder.yudao.module.system.dal.dataobject.dept.DeptDO;
import cn.iocoder.yudao.module.system.dal.dataobject.dept.PostDO;
import cn.iocoder.yudao.module.system.dal.dataobject.permission.RoleDO;
import cn.iocoder.yudao.module.system.dal.dataobject.social.SocialUserDO;
import cn.iocoder.yudao.module.system.dal.dataobject.user.AdminUserDO;
import org.mapstruct.Mapper;
import org.mapstruct.factory.Mappers;

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

@Mapper
public interface IotDeviceConvert {

    IotDeviceConvert INSTANCE = Mappers.getMapper(IotDeviceConvert.class);

    default List<IotDeviceRespVO> convertList(List<IotDeviceDO> list, Map<Long, DeptDO> deptMap) {
        return CollectionUtils.convertList(list, de -> convert(de, deptMap.get(de.getDeptId())));
    }

    default List<IotDeviceSimpleRespVO> convertSimpleLists(List<IotDeviceDO> list, Map<Long, DeptDO> deptMap) {
        return CollectionUtils.convertList(list, de -> convert2(de, deptMap.get(de.getDeptId())));
    }

    default IotDeviceSimpleRespVO convert2(IotDeviceDO device, DeptDO dept) {
        IotDeviceSimpleRespVO deviceVO = BeanUtils.toBean(device, IotDeviceSimpleRespVO.class);
        if (dept != null) {
            deviceVO.setDeptName(dept.getName());
            deviceVO.setDeviceStatusName(IotDeviceStatusEnum.nameOf(deviceVO.getDeviceStatus()).getMsg());
        }
        return deviceVO;
    }

    default List<IotDeviceRespVO> convertList1(List<IotDeviceRespVO> list, Map<Long, DeptDO> deptMap) {
        return CollectionUtils.convertList(list, de -> convert1(de, deptMap.get(de.getDeptId())));
    }

    default IotDeviceRespVO convert(IotDeviceDO user, DeptDO dept) {
        IotDeviceRespVO userVO = BeanUtils.toBean(user, IotDeviceRespVO.class);
        if (dept != null) {
            userVO.setDeptName(dept.getName());
        }
        return userVO;
    }

    default IotDeviceRespVO convert1(IotDeviceRespVO user, DeptDO dept) {
        IotDeviceRespVO userVO = BeanUtils.toBean(user, IotDeviceRespVO.class);
        if (dept != null) {
            userVO.setDeptName(dept.getName());
        }
        return userVO;
    }

    default List<UserSimpleRespVO> convertSimpleList(List<AdminUserDO> list, Map<Long, DeptDO> deptMap) {
        return CollectionUtils.convertList(list, user -> {
            UserSimpleRespVO userVO = BeanUtils.toBean(user, UserSimpleRespVO.class);
            MapUtils.findAndThen(deptMap, user.getDeptId(), dept -> userVO.setDeptName(dept.getName()));
            return userVO;
        });
    }

    default UserProfileRespVO convert(AdminUserDO user, List<RoleDO> userRoles,
                                      DeptDO dept, List<PostDO> posts, List<SocialUserDO> socialUsers) {
        UserProfileRespVO userVO = BeanUtils.toBean(user, UserProfileRespVO.class);
        userVO.setRoles(BeanUtils.toBean(userRoles, RoleSimpleRespVO.class));
        userVO.setDept(BeanUtils.toBean(dept, DeptSimpleRespVO.class));
        userVO.setPosts(BeanUtils.toBean(posts, PostSimpleRespVO.class));
        userVO.setSocialUsers(BeanUtils.toBean(socialUsers, UserProfileRespVO.SocialUser.class));
        return userVO;
    }

}
