package com.base.api.client;


import com.base.api.model.InstanceAopDTO;
import com.base.api.model.SatelliteAndInstanceRpcDTO;
import com.base.orbit.web.Result;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;

import java.util.List;

@FeignClient(name = "orbit-base-track", contextId = "calc")
public interface CalRpcService {

    /**
     * 轨道星历计算
     *
     * @param satelliteCodes 卫星代号集合
     * @param startTime      计算开始时间
     * @param endTime        计算结束时间
     */
    @RequestMapping("/calc/calcEph")
    void calcEph(@RequestParam("satelliteCodes") List<String> satelliteCodes, @RequestParam("startTime") String startTime, @RequestParam("endTime") String endTime);


    /**
     * 星下点计算
     *
     * @param satelliteCodes 卫星代号集合
     * @param startTime      开始时间
     * @param endTime        结束时间
     */
    @RequestMapping("/calc/calcSubPoint")
    void calcSubPoint(@RequestParam("satelliteCodes") List<String> satelliteCodes, @RequestParam("startTime") String startTime, @RequestParam("endTime") String endTime);


    /**
     * 地面站进出站计算
     *
     * @param satelliteIdList 卫星代号集合
     * @param stationIdList   地面站代号集合
     * @param startTime       开始时间
     * @param endTime         结束时间
     */
    @RequestMapping("/calc/calcStation")
    void calcStation(@RequestParam("satelliteIdList") List<String> satelliteIdList, @RequestParam("stationIdList") List<String> stationIdList, @RequestParam("startTime") String startTime, @RequestParam("endTime") String endTime);

    /**
     * 中继星进出站计算
     *
     * @param satelliteIdList 卫星代号集合
     * @param stationIdList   地面站代号集合
     * @param startTime       开始时间
     * @param endTime         结束时间
     */
    @RequestMapping("/calc/relayCount")
    void calcRelaySatellite(@RequestParam("satelliteIdList") List<String> satelliteIdList, @RequestParam("stationIdList") List<String> stationIdList, @RequestParam("startTime") String startTime, @RequestParam("endTime") String endTime);

    /**
     * 轨道圈号计算
     *
     * @param satelliteIds
     * @param startTime
     * @param endTime
     */
    @PostMapping("/calc/calcOrbitNum")
    void calcOrbitNum(@RequestParam("satelliteIds") List<String> satelliteIds, @RequestParam("startTime") String startTime, @RequestParam("endTime") String endTime);


    /**
     * 天文事件计算
     *
     * @param satelliteIds
     * @param stationIds
     * @param startTime
     * @param endTime
     */
    @PostMapping("/calc/calcAstronomy")
    void calcAstronomy(@RequestParam("satelliteIds") List<String> satelliteIds, @RequestParam("stationIds") List<String> stationIds, @RequestParam("startTime") String startTime, @RequestParam("endTime") String endTime);


    /**
     * 根据卫星代号查询卫星和轨道根数信息
     * 1.验证卫星代号是否为空，若为空则查询所有卫星信息，不为空则查询卫星代号对应的卫星信息
     * 2.查询所有轨道根数信息，将轨道根数根据卫星代号分组
     * 3.将卫星信息和该卫星对应的历元时刻最晚的轨道根数信息放进同一个对象中，并将该对象添加进集合中
     *
     * @param satelliteIds
     * @return
     */
    @PostMapping("/calc/groupingData")
    List<SatelliteAndInstanceRpcDTO> groupingData(List<String> satelliteIds);

    /**
     * 瞬根外推
     * @param instanceAop
     * @return
     */
    @PostMapping("/calc/calcInstance")
    Result<String> calcInstance(@RequestBody InstanceAopDTO instanceAop);

    /**
     * 调用杀死轨道计算进程脚本文件
     */
    @PostMapping("/calc/fileroute")
    void fileroute();
}
