package com.xy.service;

import com.xy.annotate.RestMappingController;
import com.xy.dto.DeviceDataDto;
import com.xy.dto.DeviceInfoDto;
import com.xy.dto.DevicePartDto;
import com.xy.dto.DeviceSysinfoDto;
import com.xy.utils.PageBean;
import com.xy.utils.R;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;

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

/**
 * <p>
 * 设备-信息 服务类
 * </p>
 *
 * @author lijin
 * @since 2022-12-23
 */
@RestMappingController("device-info")
public interface DeviceInfoService {

    /**
     * 简单商户设备分页
     * 只返回设备ID和名称
     *
     * @param dto
     * @return
     */
    @PostMapping("simpleDeviceSearchPage")
    R<PageBean<DeviceInfoDto.SimpleDeviceSearchPageVo>> simpleDeviceSearchPage(@RequestBody DeviceInfoDto.SimpleDeviceSearchPageDto dto);

    @PostMapping("netStateCount")
    R<Map<Long, DeviceInfoDto.NetStateCountVo>> netStateCount(@RequestBody DeviceInfoDto.NetStateCountDto dto);

    /**
     * 查询对象
     *
     * @param obj
     * @return
     */
    @PostMapping("obj")
    R<DeviceInfoDto.Vo> obj(@RequestBody DeviceInfoDto.Obj obj);

    /**
     * 设备访问历史添加
     *
     * @param obj
     * @return
     */
    @PostMapping("history")
    R history(@RequestBody DeviceInfoDto.Obj obj);

    /**
     * 开门检测
     *
     * @param obj
     * @return
     */
    @PostMapping("checkOpenDoor")
    R<DeviceInfoDto.Vo> checkOpenDoor(@RequestBody DeviceInfoDto.Obj obj);


    /**
     * 商户设备授权
     *
     * @param auth
     * @return {@link R}<{@link Boolean}>
     */
    @PostMapping("mercDeviceAuth")
    R<Boolean> mercDeviceAuth(@RequestBody @Validated DeviceInfoDto.MercDeviceAuthDto auth);

    @PostMapping("unBindMercDevice")
    R<Boolean> unBindMercDevice(@RequestBody @Validated DeviceInfoDto.MercDeviceUnBindDto dto);


    /**
     * 集合查询
     *
     * @param dto
     * @return
     */
    @PostMapping("list")
    R<List<DeviceInfoDto.Vo>> list(@RequestBody @Validated DeviceInfoDto.ListDto dto);

    /**
     * 通用列表查询
     *
     * @param dto
     * @return
     */
    @PostMapping("listCommon")
    R<List<DeviceInfoDto.Vo>> listCommon(@RequestBody @Validated DeviceInfoDto.ListCommon dto);

    /**
     * 更新商户线路
     *
     * @param updateLine
     * @return
     */
    @PostMapping("updateLine")
    R updateLine(@RequestBody @Validated DeviceInfoDto.UpdateLine updateLine);

    @PostMapping("pageSingle")
    R<PageBean<DeviceInfoDto.Vo>> pageSingle(@RequestBody DeviceInfoDto.PageSingle dto);

    @PostMapping("page")
    R<PageBean<DeviceInfoDto.Vo2>> page(@RequestBody DeviceInfoDto.Page page);

    /**
     * 设备流水统计
     *
     * @param dto
     * @return
     */
    @PostMapping("deviceFlowCountPage")
    R<PageBean<DeviceDataDto.DeviceFlowCountVO>> deviceFlowCountPage(@RequestBody @Valid DeviceDataDto.DeviceFlowCountDTO dto);


    /**
     * 更新商户点位
     *
     * @param updatePlace
     * @return
     */
    @PostMapping("updatePlace")
    R updatePlace(@RequestBody @Validated DeviceInfoDto.UpdatePlace updatePlace);


    /**
     * 商户设备算法列表
     *
     * @param dto
     * @return
     */
    @PostMapping("mercAlgorithmIdList")
    R<List<Long>> mercAlgorithmIdList(@RequestBody DeviceInfoDto.MercAlgorithmIdListDto dto);


    /**
     * 小程序-商户设备首页统计
     *
     * @param dto
     * @return
     */
    @PostMapping("mercHomeStatistical")
    R<DeviceInfoDto.MercHomeStatisticalVO> mercHomeStatistical(@RequestBody @Validated DeviceInfoDto.MercHomeQueryDTO dto);

    /**
     * 小程序-商户设备首页列表
     *
     * @param dto
     * @return
     */
    @PostMapping("mercHomeList")
    R<List<DeviceInfoDto.MercHomeListVO>> mercHomeList(@RequestBody @Validated DeviceInfoDto.MercHomeQueryDTO dto);


    /**
     * 小程序商户设备搜索
     *
     * @param page
     * @return
     */
    @PostMapping("mercDeviceSearchPage")
    R<PageBean<DeviceInfoDto.MerHomeSearchVO>> mercDeviceSearchPage(@RequestBody @Validated DeviceInfoDto.Page page);

    /**
     * 小程序商户设备详情-数据统计
     *
     * @param dto
     * @return
     */
    @PostMapping("dataCount")
    R<DeviceInfoDto.DeviceDataCountVO> dataCount(@RequestBody @Validated DeviceInfoDto.DeviceDataCountDTO dto);

    /**
     * 反显设别名称
     *
     * @param dto dto
     * @return {@link R}<{@link Map}<{@link Long},{@link String}>>
     */
    @PostMapping("getDeviceNameList")
    R<Map<Long, String>> getDeviceNameList(@RequestBody @Validated DeviceInfoDto.DeviceIdDto dto);


    /**
     * 查询设备信息
     *
     * @param dto
     * @return
     */
    @PostMapping("getDeviceSysinfo")
    R<DeviceSysinfoDto.Vo> getDeviceSysinfo(@RequestBody @Validated DeviceSysinfoDto.DeviceSysInfo dto);

    /**
     * 点位设备数量查询
     *
     * @param dto
     * @return
     */
    @PostMapping("placeDeviceNum")
    R<List<DeviceInfoDto.PlaceDeviceNumVo>> placeDeviceNum(@RequestBody @Validated DeviceInfoDto.PlaceDeviceNumDto dto);

    /**
     * 设备列表带卡包数
     *
     * @param algorithmCharging
     * @return
     */
    @PostMapping("algorithmChargingDevice")
    R<PageBean<DeviceInfoDto.AlgorithmChargingVo>> algorithmChargingDevice(@RequestBody @Validated DeviceInfoDto.AlgorithmCharging algorithmCharging);


    @PostMapping("listByAdminName")
    R<List<DeviceInfoDto.ListByAdminName>> listByAdminName(@RequestBody @Validated DeviceInfoDto.GroupByAdminNameDto dto);

    @PostMapping("groupByAdminName")
    R<List<DeviceInfoDto.GroupByAdminNameVo>> groupByAdminName(@RequestBody @Validated DeviceInfoDto.GroupByAdminNameDto dto);

    @PostMapping("pageByAdminName")
    R<PageBean<DeviceInfoDto.ListByAdminName>> pageByAdminName(@RequestBody @Validated DeviceInfoDto.PageByAdminNameDto dto);

    @PostMapping("updateBatch")
    R updateBatch(@RequestBody List<DeviceInfoDto.Update> updates);

    @PostMapping("updateLonByPlaceId")
    R updateLonByPlaceId(@RequestBody @Validated DeviceInfoDto.UpdateLonByPlaceId dto);

    /**
     * 激活数量统计
     *
     * @param activationCount
     * @return
     */
    @PostMapping("activationCount")
    R<Integer> activationCount(@RequestBody @Validated DeviceInfoDto.ActivationCount activationCount);

    /**
     * 商户正常设备列表
     * @param dto
     * @return
     */
    @PostMapping("mercNormalList")
    R<List<DeviceInfoDto.MercNormalListVo>> mercNormalList(@RequestBody @Validated DeviceInfoDto.MercNormalListDto dto);

    /**
     * 检查设备是否开启重力配置
     * @param dto
     * @return
     */
    @PostMapping("checkWeightOpen")
     R<Boolean> checkWeightOpen(@RequestBody  @Validated DevicePartDto.CheckWeightOpenDTO dto) ;
}
