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

import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.common.pojo.SortablePageParam;
import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils;
import cn.iocoder.yudao.module.pms.ThingsModelDTO;
import cn.iocoder.yudao.module.pms.controller.admin.iotdevicecategorytemplateattrs.vo.IotDeviceProperty;
import cn.iocoder.yudao.module.pms.controller.admin.vo.IotDevicePageReqVO;
import cn.iocoder.yudao.module.pms.controller.admin.vo.IotDeviceRespVO;
import cn.iocoder.yudao.module.pms.controller.admin.vo.IotDeviceSaveReqVO;
import cn.iocoder.yudao.module.pms.controller.admin.vo.excel.DeviceImportExcelVO;
import cn.iocoder.yudao.module.pms.dal.dataobject.IotDeviceDO;

import javax.validation.Valid;
import java.util.Collection;
import java.util.List;
import java.util.Map;

/**
 * 设备台账 Service 接口
 *
 * @author 芋道源码
 */
public interface IotDeviceService {
    String getDeviceCompany(Long id);
    String getMaxCode(String prefix);
    List<IotDeviceDO> getAllDevices(IotDevicePageReqVO pageReqVO);
    void templateChange(String categoryId, List<IotDeviceProperty> properties);
    void importDevice(List<DeviceImportExcelVO> list);
    List<IotDeviceDO> getMapDevice(IotDevicePageReqVO pageReqVO);
    List<ThingsModelDTO> getTdParams(IotDeviceDO iotDeviceDO);
    List<ThingsModelDTO> getTdGatewayParams(IotDeviceDO iotDeviceDO);
    List<ThingsModelDTO> getTdZhbdParams(IotDeviceDO iotDeviceDO);
    /**
     * 创建设备台账
     *
     * @param createReqVO 创建信息
     * @return 编号
     */
    Long createIotDevice(@Valid IotDeviceSaveReqVO createReqVO);

    /**
     * 更新设备台账
     *
     * @param updateReqVO 更新信息
     */
    void updateIotDevice(@Valid IotDeviceSaveReqVO updateReqVO);

    /**
     * 删除设备台账
     *
     * @param id 编号
     */
    void deleteIotDevice(Long id);

    /**
     * 获得设备台账
     *
     * @param id 编号
     * @return 设备台账
     */
    IotDeviceDO getIotDevice(Long id);

    /**
     * 获得设备台账分页
     *
     * @param pageReqVO 分页查询
     * @return 设备台账分页
     */
    PageResult<IotDeviceDO> getIotDevicePage(IotDevicePageReqVO pageReqVO, SortablePageParam sortablePageParam);
    PageResult<IotDeviceDO> getIotDevicePageApp(IotDevicePageReqVO pageReqVO, SortablePageParam sortablePageParam);
    void updateSort();
    void updateBrandName();
    void updateCharge();
    /**
     * 获得设备精简列表
     *
     * @param reqVO 分页查询
     * @return 设备台账分页
     */
    List<IotDeviceDO> getSimpleDeviceList(IotDevicePageReqVO reqVO);

    /**
     * 项目-任务 根据选择的部门筛选设备 忽略数据权限
     *
     * @param reqVO 查询参数
     * @return 设备台账列表
     */
    List<IotDeviceDO> getDevicesByDepts(IotDevicePageReqVO reqVO);

    PageResult<IotDeviceDO> getIotDeviceTdPage(IotDevicePageReqVO pageReqVO, List<String> codes);
    PageResult<IotDeviceDO> getIotDeviceTdPageApp(IotDevicePageReqVO pageReqVO, List<String> codes);

    /**
     * 获得 设备bom 关联 关系 分页
     *
     * @param pageReqVO 分页查询
     * @return 设备bom 关联分页
     */
    PageResult<IotDeviceRespVO> deviceAssociateBomPage(IotDevicePageReqVO pageReqVO);

    /**
     * 查询 设置过责任人 的设备分布列表
     *
     * @param pageReqVO 分页查询
     * @return 设备bom 关联分页
     */
    PageResult<IotDeviceRespVO> personRelationDevices(IotDevicePageReqVO pageReqVO);

    /**
     * 查询 调整过状态 的设备分布列表
     *
     * @param pageReqVO 分页查询
     * @return 设备bom 关联分页
     */
    PageResult<IotDeviceRespVO> statusRelationDevices(IotDevicePageReqVO pageReqVO);

    /**
     * 查询 发生过调拨 的设备分布列表
     *
     * @param pageReqVO 分页查询
     * @return 设备 关联分页
     */
    PageResult<IotDeviceRespVO> allotRelationDevices(IotDevicePageReqVO pageReqVO);

    /**
     * 获得 设备bom 关联 关系 列表
     *
     * @param pageReqVO
     * @return 设备bom 关联 列表
     */
    List<IotDeviceRespVO> deviceAssociateBomList(IotDevicePageReqVO pageReqVO);
    PageResult<IotDeviceRespVO> deviceAssociateBomListPage(IotDevicePageReqVO pageReqVO);

    /**
     * 根据设备id查询设备关联信息
     *
     * @param ids 设备id集合
     * @return 设备bom 关联 列表
     */
    default Map<Long, IotDeviceRespVO> getDeviceMap(List<Long> ids){
        List<IotDeviceRespVO> list = getDeviceList(ids);
        return CollectionUtils.convertMap(list, IotDeviceRespVO::getId);
    }

    /**
     * 获得设备信息数组
     *
     * @param ids 设备编号数组
     * @return 设备信息数组
     */
    List<IotDeviceRespVO> getDeviceList(Collection<Long> ids);
}
