package com.zc.business.controller;

import com.alibaba.fastjson.JSONArray;
import com.ruoyi.common.core.domain.AjaxResult;
import com.zc.business.domain.*;
import com.zc.business.request.DcTrafficMetricsDataRequest;
import com.zc.business.request.DcTrafficSectionDataRequest;
import com.zc.business.service.IDcGantryStatisticsDataService;
import com.zc.business.service.IDcTollStationStatisticsDataService;
import com.zc.business.service.IDcTrafficSectionStatisticsService;
import com.zc.business.service.IDcTrafficStatisticsService;
import com.zc.common.core.httpclient.exception.HttpException;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.io.IOException;
import java.util.List;
import java.util.Map;

/**
 * 交通数据统计
 *
 * @author xiepufeng
 */
@Api(tags = "交通数据统计")
@RestController
@RequestMapping("/business/traffic-statistics")
public class DcTrafficStatisticsController {

    @Autowired
    private IDcTrafficSectionStatisticsService dcTrafficSectionStatisticsService;

    @Autowired
    private IDcTrafficStatisticsService dcTrafficStatisticsService;

    @Autowired
    private IDcTollStationStatisticsDataService dcTollStationStatisticsDataService;

    @Autowired
    private IDcGantryStatisticsDataService dcGantryStatisticsDataService;

    /**
     * 获取当前交通截面数据
     *
     * @param request 请求参数,封装了对于交通截面数据查询的详细要求
     * @return 返回一个AjaxResult对象,其中包含了查询结果。如果查询成功,则结果中封装了当前交通截面的数据(DcTrafficSectionData类型)
     */
    @ApiOperation("获取当前交通截面数据")
    @GetMapping("/current/sections")
    public AjaxResult currentSections(DcTrafficSectionDataRequest request){
        // 调用服务层方法,查询当前交通截面数据
        List<DcTrafficSectionData> dcTrafficMetricsData = dcTrafficSectionStatisticsService.currentSections(request);
        // 将查询结果封装为AjaxResult对象返回
        return AjaxResult.success(dcTrafficMetricsData);
    }

    /**
     * 获取历史交通截面数据
     *
     * @param request 包含交通截面数据请求参数的对象
     * @return 返回一个包含历史交通截面数据的AjaxResult对象
     */
    @ApiOperation("获取历史交通截面数据")
    @GetMapping("/history/sections")
    public AjaxResult historySections(DcTrafficSectionDataRequest request){
        // 调用服务层方法,获取历史交通截面的统计数据
        List<DcTrafficSectionData> dcTrafficMetricsData = dcTrafficSectionStatisticsService.historySections(request);
        // 将获取到的历史交通截面数据封装成AjaxResult对象并返回
        return AjaxResult.success(dcTrafficMetricsData);
    }


    /**
     * 获取当前交通特征指数
     *
     * @param request 请求参数,封装了获取交通指标所需的数据和条件
     * @return 返回当前交通特征指数的数据结果,使用AjaxResult包装
     */
    @ApiOperation("获取当前交通特征指数")
    @GetMapping("/current/metrics")
    public AjaxResult currentTrafficMetrics(DcTrafficMetricsDataRequest request){
        // 调用服务层方法,获取当前交通指标数据
        List<DcTrafficMetricsData> dcTrafficMetricsData = dcTrafficSectionStatisticsService.currentTrafficMetrics(request);
        // 将获取到的交通指标数据封装为成功的结果并返回
        return AjaxResult.success(dcTrafficMetricsData);
    }

    /**
     * 获取历史交通特征指数
     *
     * @param request 请求参数,包含需要查询的历史交通特征指数的详细信息
     * @return 返回一个AjaxResult对象,其中包含了查询结果的成功状态和历史交通特征指数数据列表
     */
    @ApiOperation("获取历史交通特征指数")
    @GetMapping("/history/metrics")
    public AjaxResult historyTrafficMetrics(DcTrafficMetricsDataRequest request){
        // 调用服务层方法,查询历史交通特征指数数据
        List<DcTrafficMetricsData> dcTrafficMetricsDataList = dcTrafficSectionStatisticsService.historyTrafficMetrics(request);
        // 将查询结果封装成成功响应并返回
        return AjaxResult.success(dcTrafficMetricsDataList);
    }

    /**
     * 获取当前拥堵路段
     *
     * @param direction 交通方向,指定查询哪个方向的拥堵路段。具体方向的定义根据实际业务而定。
     * @return 返回一个AjaxResult对象,其中包含了查询结果。如果查询成功,则结果中封装了当前拥堵路段的数据列表。
     */
    @ApiOperation("获取当前拥堵路段")
    @GetMapping("/current/congested")
    public AjaxResult currentCongestedSection(Byte direction){
        // 调用服务层方法,获取当前交通指标数据
        List<DcCongestedSectionData> dcTrafficMetricsData = dcTrafficSectionStatisticsService.currentCongestedSection(direction);
        // 将获取到的交通指标数据封装为成功的结果并返回
        return AjaxResult.success(dcTrafficMetricsData);
    }

    /**
     * 获取累计车流量
     *
     * 本方法用于根据特定条件查询历史车流量数据,通过接收一个包含查询条件的请求对象,
     * 调用服务层方法进行数据查询,并将查询结果封装成AjaxResult对象返回。
     *
     * @param request 包含查询条件的请求对象,用于获取特定条件下的历史车流量数据。请求对象中可能包含了时间范围、地点等查询条件。
     * @return 返回一个AjaxResult对象,其中包含了查询到的历史车流量数据列表。AjaxResult是本系统中用于封装响应数据的通用对象,其中的success方法用于将查询结果封装为成功响应返回。
     */
    @ApiOperation("获取累计车流量")
    @GetMapping("/history/flow")
    public AjaxResult historyFlow(DcStatisticsData request){
        // 调用服务层方法,根据请求条件查询历史车流量数据
        List<DcStatisticsData> dcStatisticsData = dcTrafficStatisticsService.historyFlow(request);
        // 将查询结果封装为成功响应并返回
        return AjaxResult.success(dcStatisticsData);
    }

    /**
     * 获取收费站统计数据
     *
     * @param request 包含查询条件的请求对象,用于筛选历史收费站统计数据
     * @return 返回一个AjaxResult对象,其中包含了查询到的收费站统计数据列表
     */
    @ApiOperation("获取收费站统计数据")
    @GetMapping("/history/toll-station")
    public AjaxResult historyTollStation(DcTollStationStatisticsData request){
        // 调用服务层方法,根据请求条件查询历史车收费站数据
        List<DcTollStationStatisticsData> dcStatisticsData = dcTollStationStatisticsDataService.tollStationData(request);
        // 将查询结果封装为成功响应并返回
        return AjaxResult.success(dcStatisticsData);
    }

    /**
     * 获取累计车流量
     *
     * @param request 包含查询条件的请求对象,用于筛选历史收费站统计数据
     * @return 返回一个AjaxResult对象,其中包含了查询到的收费站统计数据列表
     */
    @ApiOperation("获取累计车流量")
    @GetMapping("/history/accumulated-flow")
    public AjaxResult accumulatedFlow(DcTollStationStatisticsData request){
        // 调用服务层方法,根据请求条件查询历史车收费站数据
        List<DcTollStationStatisticsData> dcStatisticsData = dcTollStationStatisticsDataService.accumulatedFlow(request);
        // 将查询结果封装为成功响应并返回
        return AjaxResult.success(dcStatisticsData);
    }

    /**
     * 获取门架统计数据
     *
     * @param request 包含查询条件的请求对象,用于筛选历史门架统计数据
     * @return 返回一个AjaxResult对象,其中包含了查询到的门架统计数据列表
     */
    @ApiOperation("获取门架统计数据")
    @GetMapping("/history/gantry")
    public AjaxResult historyTollStation(DcGantryStatisticsData request){
        // 调用服务层方法,根据请求条件查询历史车门架数据
        List<DcGantryStatisticsData> dcStatisticsData = dcGantryStatisticsDataService.gantryData(request);
        // 将查询结果封装为成功响应并返回
        return AjaxResult.success(dcStatisticsData);
    }


    /********************************************* 智慧高速平接口 **************************************************/


    /**
     * 获取在途车辆流量(分车型)
     * 该接口不接受任何参数,调用后返回在途车辆的统计数据,数据格式为JSONObject。
     *
     * @return AjaxResult 返回类型为AjaxResult,其中包含了操作结果和在途车辆统计数据的JSONObject。
     */
    @ApiOperation("获取在途车辆流量(分车型)")
    @GetMapping("/current/in-transit-vehicles")
    public AjaxResult vehiclesInTransit() throws HttpException, IOException {
        // 调用服务层方法,获取在途车辆的统计数据
        JSONArray dcStatisticsData = dcTrafficStatisticsService.vehiclesInTransit();
        return AjaxResult.success(dcStatisticsData);
    }

    @ApiOperation("获取在途车路段平均车速")
    @GetMapping("/current/average-speed")
    public AjaxResult currentAverageSpeed() throws HttpException, IOException {
        // 调用服务层方法,获取在途车辆的统计数据
        JSONArray dcStatisticsData = dcTrafficStatisticsService.currentAverageSpeed();
        return AjaxResult.success(dcStatisticsData);
    }

    /**
     * 获取当前拥堵事件信息(智慧高速平台)
     *
     * @return 返回一个AjaxResult对象,其中包含了查询结果。如果查询成功,则结果中封装了当前拥堵路段的数据列表。
     */
    @ApiOperation("获取当前拥堵事件信息")
    @GetMapping("/current/event-congested")
    public AjaxResult currentEventCongested() throws HttpException, IOException {
        // 调用服务层方法,获取当前交通指标数据
        JSONArray jsonArray = dcTrafficStatisticsService.currentEventCongested();
        // 将获取到的交通指标数据封装为成功的结果并返回
        return AjaxResult.success(jsonArray);
    }

    /**
     * 获取当前拥堵路段信息
     *
     * @return 返回一个AjaxResult对象,其中包含了查询结果。如果查询成功,则结果中封装了当前拥堵路段的数据列表。
     */
    @ApiOperation("获取当前路段拥堵信息")
    @GetMapping("/current/section-congested")
    public AjaxResult currentSectionCongested() throws HttpException, IOException {
        // 调用服务层方法,获取当前交通指标数据
        List<DcRoadSectionCongestion> roadSectionCongestions = dcTrafficStatisticsService.currentSectionCongested();
        // 将获取到的交通指标数据封装为成功的结果并返回
        return AjaxResult.success(roadSectionCongestions);
    }

    /**
     * 获取车道占有率信息
     *
     */
    @ApiOperation("获取车道占有率信息")
    @GetMapping("/history/lane-occupancy")
    public AjaxResult laneOccupancy(String startDate, String endDate) throws HttpException, IOException {
        // 调用服务层方法,获取当前交通指标数据
        JSONArray jsonArray = dcTrafficStatisticsService.laneOccupancy(startDate, endDate);
        // 将获取到的交通指标数据封装为成功的结果并返回
        return AjaxResult.success(jsonArray);
    }


}