package com.sptg.permissions.api.feigns;

import com.baomidou.mybatisplus.plugins.Page;
import com.sptg.common.core.beans.PageBean;
import com.sptg.common.core.beans.ResultBean;
import com.sptg.permissions.api.dto.DeviceAuthorizeDto;
import com.sptg.permissions.api.dto.RegionDto;
import com.sptg.permissions.api.entity.DeviceAuthorize;
import com.sptg.permissions.api.entity.Region;
import com.sptg.permissions.api.feigns.fallback.DeviceAuthorizeFeignFallbackFactory;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.*;

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

/**
 * title: DeviceAuthorizeFeign
 * package: com.sptg.permissions.api.feigns
 * description: 设备授权服务接口
 *
 *
 *
 */
@FeignClient(value = "smart-house-permissions",fallbackFactory = DeviceAuthorizeFeignFallbackFactory.class)
public interface DeviceAuthorizeFeign {

    /**
     * 功能描述: 分页查询已授权的单元Id
     * @param pageBean
     * {
     *      page    :   必填
     *      dto     :   查询条件
     * }
     * @return Page<DeviceAuthorize>
     *
     *
     */
    @PostMapping(value = "/device/authorize/dy/pagingQuery")
    Page<DeviceAuthorize> pagingQueryDy(@RequestBody PageBean<DeviceAuthorize,DeviceAuthorizeDto> pageBean);

    /**
     * 功能描述: 分页查询已授权设备Id
     * @param pageBean
     * {
     *      page    :   必填
     *      dto     :   查询条件
     * }
     * @return Page<DeviceAuthorize>
     *
     *
     */
    @PostMapping(value = "/device/authorize/pagingQuery")
    Page<DeviceAuthorize> pagingQuery(@RequestBody PageBean<DeviceAuthorize,DeviceAuthorizeDto> pageBean);

    /**
     * 功能描述: 分页查询已特殊授权设备Id
     * @param pageBean
     * {
     *      page    :   必填
     *      dto     :   查询条件
     * }
     * @return Page<DeviceAuthorize>
     *
     *
     */
    @PostMapping(value = "/device/specialAuthorize/pagingQuery")
    Page<DeviceAuthorize> specialDevicesPagingQuery(@RequestBody PageBean<DeviceAuthorize,DeviceAuthorizeDto> pageBean);

    /**
     * 功能描述: 分页查询已授权设备Id,根据区域分组
     * @param pageBean
     * {
     *      page    :   必填
     *      dto     :   查询条件
     * }
     * @return Page<DeviceAuthorize>
     *
     *
     */
    @PostMapping(value = "/device/authorize/region/pagingQuery")
    Page<Region> pagingQueryRegion(@RequestBody PageBean<Region,RegionDto> pageBean);

    /**
     * 功能描述:根据位置查询覆盖数量
     * @param dto
     * {
     *    orgPosition : 位置信息
     * }
     * @return ResultBean<Map<String,Long>>
     *
     *
     */
    @PostMapping(value = "/device/authorize/getDeviceAccount")
    ResultBean<Map<String,Long>> getDeviceCoverAccount(@RequestBody DeviceAuthorizeDto dto);

    /**
     * 功能描述:设备数量
     * @param dto
     * {
     *    orgPosition : 位置信息
     * }
     * @return long
     *
     *
     */
    @PostMapping(value = "/device/authorize/getDeviceCount")
    Long getDeviceCount(@RequestBody DeviceAuthorizeDto dto);

    /**
     * 功能描述:统计各个省份覆盖数量
     * @param dto
     * {
     *    deviceRegionProvince :省份信息
     *    orgPosition : 位置信息
     * }
     * @return List<Map<String,Object>>
     *
     *
     */
    @PostMapping(value = "/device/authorize/getDeviceCountForArea")
    List<Map<String,Object>> getDeviceCountForArea(@RequestBody DeviceAuthorizeDto dto);

    /**
     * 功能描述:查询不同设备安装位置数量(小区，单元，停车设备总数)
     * @param dto
     * {
     *    orgPosition : 位置信息
     * }
     * @return Map<String,Object>
     *
     *
     */
    @PostMapping(value = "/device/authorize/getDeviceCountForInstallPathType")
    Map<String,Object> getDeviceCountForInstallPathType(@RequestBody DeviceAuthorizeDto dto);

    /**
     * 功能描述:统计某月的设备数量
     * @param dto
     * {
     *    deviceRegionProvince : 省
     *    deviceRegionCity : 市
     *    deviceRegionArea : 区
     *    selectYear : 查询年份条件
     *    orgPosition : 位置信息
     * }
     * @return List<Map<String,Object>>
     *
     *
     */
    @PostMapping(value = "/device/authorize/getDeviceCountForMonth")
    List<Map<String,Object>> getDeviceCountForMonth(@RequestBody DeviceAuthorizeDto dto);

    /**
     * 获取设备的授权机构位置列表
     * @param serialNumber 设备序列号
     * @return List<String>
     */
    @GetMapping(value = "/device/authorize/getDeviceAuthorizeOrgList/{serialNumber}")
    List<String> getDeviceAuthorizeOrgList(@PathVariable(value = "serialNumber") String serialNumber);

    /**
     * 根据机构位置查询可见的设备Id列表
     * @param orgPosition 机构位置
     * @return 设备Id列表
     */
    @GetMapping(value = "/device/authorize/getDeviceIdListByOrg")
    List<Long> getDeviceIdListByOrg(@RequestParam(value = "orgPosition")String orgPosition);
}
