package org.nl.acs.route.service;

import com.alibaba.fastjson.JSONArray;
import org.nl.acs.common.base.PageInfo;
import org.nl.acs.common.base.CommonService;
import org.nl.acs.route.domain.RouteLine;
import org.nl.acs.route.service.dto.RouteLineDto;
import org.nl.acs.route.service.dto.RouteLineQueryParam;
import org.springframework.data.domain.Pageable;

import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.sql.SQLException;
import java.util.List;
import java.util.Map;
import java.util.Set;

/**
* @author jiaolm
* @date 2023-05-09
*/
public interface RouteLineService extends CommonService<RouteLine>  {

    static final String CACHE_KEY = "routeLine";

    /**
    * 查询数据分页
    * @param query 条件
    * @param pageable 分页参数
    * @return PageInfo<RouteLineDto>
    */
    PageInfo<RouteLineDto> queryAll(RouteLineQueryParam query, Pageable pageable);

    /**
    * 查询所有数据不分页
    * @param query 条件参数
    * @return List<RouteLineDto>
    */
    List<RouteLineDto> queryAll(RouteLineQueryParam query);

    RouteLine getById(String id);
    RouteLineDto findById(String id);

    /**
     * 插入一条新数据。
     */
    int insert(RouteLineDto resources);
    int updateById(RouteLineDto resources);
    int removeById(String id);
    int removeByIds(Set<String> ids);

    /**
    * 导出数据
    * @param all 待导出的数据
    * @param response /
    * @throws IOException /
    */
    // void download(List<RouteLineDto> all, HttpServletResponse response) throws IOException;

    /**
     * 查询数据分页
     *
     * @param whereJson 条件
     * @param page      分页参数
     * @return Map<String, Object>
     */
    Map<String, Object> queryAll(Map whereJson, Pageable page);

    /**
     * 查询所有数据不分页
     *
     * @param whereJson 条件参数
     * @return List<RouteLineDto>
     */
    List<RouteLineDto> queryAll(Map whereJson);


    /**
     * 根据ID查询
     *
     * @param line_uuid ID
     * @return RouteLine
     */
//    RouteLineDto findById(String line_uuid);

    /**
     * 根据编码查询
     *
     * @param code code
     * @return RouteLine
     */
    RouteLineDto findByCode(String code);

    /**
     * 根据编码查询
     *
     * @param code code
     * @return RouteLine
     */
//    JSONArray queryAll(String code, String plan_uuid);

    /**
     * 根据编码，查询上一级的路由，即能到达此设备的路由
     *
     * @param code
     * @return
     */
//    JSONArray querySuperiorLine(String code, String plan_uuid);

    /**
     * 根据编码，查询下一级的路由，即此设备目标的路由
     *
     * @param code
     * @return
     */
    JSONArray queryNextLine(String code, String plan_uuid);

    /**
     * 根据编码，查询下一级的路由，即此设备目标的路由
     * 按照任务数量与权重进行累计，只会返回一条路由
     *
     * @param code
     * @return
     */
//    RouteLineDto queryNextLineByWeight(String code, String plan_uuid);

    /**
     * 根据编码，查询上一级的路由，即此设备起点的路由
     * 按照任务数量与权重进行累计，只会返回一条路由
     *
     * @param code
     * @return
     */
//    RouteLineDto querySuperiorLineByWeight(String code, String plan_uuid);

    /**
     * 根据编码，查询上一级的路由，即此设备起点的路由
     * 按照任务数量与权重进行累计，只会返回一条路由
     *
     * @param
     * @return
     */
//    RouteLineDto queryLineByPoint(String code1, String code2, String plan_uuid);

    /**
     * 创建
     *
     * @param data /
     */
    void create(Map data) throws SQLException;

    /**
     * 编辑
     *
     * @param dto /
     */
    void update(RouteLineDto dto) throws SQLException;


    /**
     * 多选删除
     *
     * @param ids /
     */
    void deleteAll(String[] ids) throws SQLException;

    /**
     * 导出数据
     *
     * @param dtos     待导出的数据
     * @param response /
     * @throws IOException /
     */
    void download(List<RouteLineDto> dtos, HttpServletResponse response) throws IOException;

    /**
     * 启用或停用
     *
     * @param ia_active 1 启用，0 禁用
     */
    void enabled(String routeLineId, String ia_active) throws SQLException;

    /**
     * 更新通路情况
     * 任意两台设备之间的通路情况
     */
    void replaceAccess(String route_plan_id);

    /**
     * 查询两个设备之间是否通路
     *
     * @param startDeviceCode 开始设备编号
     * @param endDeviceCode   终点设备编号
     * @return true 通路  false 不通
     */
    boolean getReplaceAccess(String startDeviceCode, String endDeviceCode);

    void reload() throws SQLException;

    boolean checkRouteLine(String startDevice, String nextDevice, String routecode) throws Exception;

    public Map<String, List> getRouteLines();

    public List<RouteLineDto> getShortPathLines(String device_code, String next_device_code, String plan_code);

    /**
     * 根据起点设备编号查询所有目的地设备
     *
     * @param device_code
     * @param plan_code
     * @return
     */
    public List<RouteLineDto> getShortPathLinesByCode(String device_code, String plan_code);

    /**
     * 根据目的地设备编号查询所有起点设备
     *
     * @param device_code
     * @param plan_code
     * @return
     */
    public List<RouteLineDto> getPathLinesByCode(String device_code, String plan_code);

    public List<RouteLineDto> getSuperiorShortPathLinesByCode(String device_code, String plan_code);

    public JSONArray getActivePathLine(String device_code, String next_device_code, String plan_code);
}
