package com.fs.live.mapper;


import com.fs.common.annotation.DataSource;
import com.fs.common.enums.DataSourceType;
import com.fs.live.domain.LiveData;
import com.fs.live.param.LiveDataCompanyParam;
import com.fs.live.vo.LiveDataCompanyVO;
import com.fs.live.vo.LiveDataDetailVo;
import com.fs.live.param.LiveRoomStudentParam;
import com.fs.live.vo.LiveDataListVo;
import com.fs.live.vo.LiveDataStatisticsVo;
import com.fs.live.vo.LiveStatisticsOverviewVO;
import com.fs.live.vo.LiveRoomStudentQueryVO;
import com.fs.live.vo.LiveUserDetailVo;
import com.fs.live.vo.LiveAppSimpleVO;
import com.fs.live.vo.RecentLiveDataVo;
import com.fs.live.vo.TrendDataVO;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;
import org.springframework.stereotype.Repository;

import java.math.BigDecimal;
import java.util.List;
import java.util.Map;

/**
 * 直播数据Mapper接口
 *
 * @author fs
 * @date 2025-03-05
 */
@Repository
public interface LiveDataMapper {
    /**
     * 查询直播数据
     *
     * @param liveId 直播数据主键
     * @return 直播数据
     */
    LiveData selectLiveDataByLiveId(Long liveId);

    /**
     * 查询已有数据概览缓存的直播间
     */
    List<LiveData> selectLiveDataOverviewByLiveIds(@Param("liveIds") List<Long> liveIds);

    /**
     * 更新数据概览缓存
     */
    int updateLiveDataOverview(LiveData liveData);

    /**
     * 插入数据概览缓存
     */
    int insertLiveDataOverview(LiveData liveData);

    /**
     * 查询直播数据列表
     *
     * @param liveData 直播数据
     * @return 直播数据集合
     */
    List<LiveData> selectLiveDataList(LiveData liveData);

    /**
     * 新增直播数据
     *
     * @param liveData 直播数据
     * @return 结果
     */
    int insertLiveData(LiveData liveData);

    /**
     * 修改直播数据
     *
     * @param liveData 直播数据
     * @return 结果
     */
    int updateLiveData(LiveData liveData);

    /**
     * 删除直播数据
     *
     * @param liveId 直播数据主键
     * @return 结果
     */
    int deleteLiveDataByLiveId(Long liveId);

    /**
     * 批量删除直播数据
     *
     * @param liveIds 需要删除的数据主键集合
     * @return 结果
     */
    int deleteLiveDataByLiveIds(Long[] liveIds);

    /**
     * 查询所有正在直播的id
     * @return
     */
    List<Long> getAllLiveIds();

    /**
     * 查询近期直播数据
     * @return
     */
    List<RecentLiveDataVo> getRecentLive();

    /**
     * 查询直播数据top10
     * @param rankType
     * @return
     */
    List<RecentLiveDataVo> getLiveTop(@Param("rankType") String rankType);

    /**
     * 查询所选时间周期的直播数据
     * @param startDate
     * @param endDate
     * @return
     */
    TrendDataVO getCurrentData(@Param("startDate") String startDate, @Param("endDate") String endDate);

    /**
     * 查询折线图展示的直播数据
     * @param chartStartDate
     * @param chartEndDate
     * @param format
     * @return
     */
    List<Map<String, Object>> getChartData(@Param("chartStartDate") String chartStartDate, @Param("chartEndDate") String chartEndDate, @Param("format") String format,@Param("category") String category);

    /**
     * 查询所选时间上一个周期的直播数据
     * @param prevStartDate
     * @param prevEndDate
     * @return
     */
    TrendDataVO getPreviousData(@Param("prevStartDate") String prevStartDate, @Param("prevEndDate") String prevEndDate);

    List<LiveData> getAllLiveDatas();


    void updateBatchLiveData(@Param("liveDatas") List<LiveData> liveDatas);

    List<RecentLiveDataVo> getCompanyRecentLive(@Param("companyId") Long companyId);

    List<RecentLiveDataVo> getCompanyLiveTop(@Param("rankType") String rankType,@Param("companyId") Long companyId);

    TrendDataVO getCompanyCurrentData(@Param("startDate") String start,@Param("endDate") String end,@Param("companyId") Long companyId);

    TrendDataVO getCompanyPreviousData(@Param("prevStartDate") String start,@Param("prevEndDate") String end,@Param("companyId") Long companyId);

    List<Map<String, Object>> getCompanyChartData(@Param("chartStartDate") String chartStartDate,@Param("chartEndDate") String chartEndDate, @Param("format") String format,@Param("category") String category,@Param("companyId") Long companyId);

    @Select("SELECT " +
            "    ld.total_views AS liveViewNum, " +
            "    ld.replay_view_num AS replayViewNum, " +
            "    ld.likes AS liveLikeNum, " +
            "    ld.replay_like_num AS replayLikeNum " +
            "FROM " +
            "    live_data ld " +
            "where ld.live_id=#{liveId}")
    @DataSource(DataSourceType.SLAVE)
    Map<String, Integer> selectDashboardCount(@Param("liveId") Long liveId);

    /**
     * 查询直播间统计数据
     * @param liveIds 直播间ID列表
     * @return 统计数据
     */
    @DataSource(DataSourceType.SLAVE)
    LiveDataStatisticsVo selectLiveDataStatistics(@Param("liveIds") List<Long> liveIds);

    /**
     * 查询直播间列表数据
     * @param liveIds 直播间ID列表
     * @return 列表数据
     */
    @DataSource(DataSourceType.SLAVE)
    List<LiveDataListVo> selectLiveDataListByLiveIds(@Param("liveIds") List<Long> liveIds);

    /**
     * 查询直播间详情数据（SQL方式）
     * @param liveId 直播间ID
     * @return 详情数据
     */
    @DataSource(DataSourceType.SLAVE)
    LiveDataDetailVo selectLiveDataDetailBySql(@Param("liveId") Long liveId);

    /**
     * 查询直播间用户详情列表（SQL方式）
     * @param liveId 直播间ID
     * @return 用户详情列表
     */
    @DataSource(DataSourceType.SLAVE)
    List<LiveUserDetailVo> selectLiveUserDetailListBySql(@Param("liveId") Long liveId,@Param("companyId") Long companyId,@Param("companyUserId") Long companyUserId);

    /**
     * 查询满足条件的直播间ID列表
     */
    @DataSource(DataSourceType.SLAVE)
    List<Long> selectLiveIdsByCompanyParam(LiveDataCompanyParam param);

    /**
     * 分公司总到课人数统计
     */
    @DataSource(DataSourceType.SLAVE)
    List<LiveDataCompanyVO> selectAttendanceCountByCompany(@Param("liveIds") List<Long> liveIds,
                                                           @Param("companyIds") List<Long> companyIds);

    /**
     * 分公司总完课人数统计
     */
    @DataSource(DataSourceType.SLAVE)
    List<LiveDataCompanyVO> selectCompleteCountByCompany(@Param("liveIds") List<Long> liveIds,
                                                         @Param("companyIds") List<Long> companyIds);

    /**
     * 分公司直播课人数统计
     */
    @DataSource(DataSourceType.SLAVE)
    List<LiveDataCompanyVO> selectLiveAttendCountByCompany(@Param("liveIds") List<Long> liveIds,
                                                           @Param("companyIds") List<Long> companyIds);

    /**
     * 分公司直播完课人数统计
     */
    @DataSource(DataSourceType.SLAVE)
    List<LiveDataCompanyVO> selectLiveCompleteCountByCompany(@Param("liveIds") List<Long> liveIds,
                                                             @Param("companyIds") List<Long> companyIds);

    /**
     * 分公司回放课人数统计
     */
    @DataSource(DataSourceType.SLAVE)
    List<LiveDataCompanyVO> selectReplayAttendCountByCompany(@Param("liveIds") List<Long> liveIds,
                                                             @Param("companyIds") List<Long> companyIds);

    /**
     * 分公司回放完课人数统计
     */
    @DataSource(DataSourceType.SLAVE)
    List<LiveDataCompanyVO> selectReplayCompleteCountByCompany(@Param("liveIds") List<Long> liveIds,
                                                               @Param("companyIds") List<Long> companyIds);

    /**
     * 分公司订单、GMV统计
     */
    @DataSource(DataSourceType.SLAVE)
    List<LiveDataCompanyVO> selectCompanyOrderAndGmv(@Param("liveIds") List<Long> liveIds,
                                                     @Param("companyIds") List<Long> companyIds);

    /**
     * 分公司员工数量统计
     */
    @DataSource(DataSourceType.SLAVE)
    List<LiveDataCompanyVO> selectCompanyEmployeeCountByLiveIds(@Param("liveIds") List<Long> liveIds,
                                                                @Param("companyIds") List<Long> companyIds);

    /**
     * 查询正在直播的直播间（仅 liveId、liveType、封面、标题），用于首页推荐
     * status=2 表示直播中
     */
    @DataSource(DataSourceType.SLAVE)
    List<LiveAppSimpleVO> selectLivingLivesForApp();

    /**
     * 查询直播数据统计-数据概览（12项指标）- 已废弃，使用拆分查询替代
     * @param liveIds 直播间ID列表
     * @return 数据概览VO
     */
    @Deprecated
    @DataSource(DataSourceType.SLAVE)
    LiveStatisticsOverviewVO selectLiveStatisticsOverview(@Param("liveIds") List<Long> liveIds);

    // ========== 数据概览拆分查询（每表独立查询，Java层合并） ==========
    @DataSource(DataSourceType.SLAVE)
    Long selectOverviewBeforeLiveUv(@Param("liveIds") List<Long> liveIds);
    @DataSource(DataSourceType.SLAVE)
    Long selectOverviewTotalWatchUv(@Param("liveIds") List<Long> liveIds);
    @DataSource(DataSourceType.SLAVE)
    Long selectOverviewOver10MinCount(@Param("liveIds") List<Long> liveIds);
    @DataSource(DataSourceType.SLAVE)
    Long selectOverviewWatchTotalSeconds(@Param("liveIds") List<Long> liveIds);
    @DataSource(DataSourceType.SLAVE)
    Long selectOverviewWatchUserCount(@Param("liveIds") List<Long> liveIds);
    @DataSource(DataSourceType.SLAVE)
    Long selectOverviewReplayWatchUv(@Param("liveIds") List<Long> liveIds);
    @DataSource(DataSourceType.SLAVE)
    Long selectOverviewReplayVisitPv(@Param("liveIds") List<Long> liveIds);
    @DataSource(DataSourceType.SLAVE)
    Long selectOverviewReplayOnlyCount(@Param("liveIds") List<Long> liveIds);
    @DataSource(DataSourceType.SLAVE)
    Long selectOverviewReplayTotalSeconds(@Param("liveIds") List<Long> liveIds);
    @DataSource(DataSourceType.SLAVE)
    Long selectOverviewReplayUserCount(@Param("liveIds") List<Long> liveIds);
    @DataSource(DataSourceType.SLAVE)
    Long selectOverviewCompleteCount(@Param("liveIds") List<Long> liveIds);
    @DataSource(DataSourceType.SLAVE)
    Long selectOverviewSubscribeCount(@Param("liveIds") List<Long> liveIds);
    @DataSource(DataSourceType.SLAVE)
    Long selectOverviewLotteryCount(@Param("liveIds") List<Long> liveIds);
    @DataSource(DataSourceType.SLAVE)
    Long selectOverviewLotteryJoinCount(@Param("liveIds") List<Long> liveIds);
    @DataSource(DataSourceType.SLAVE)
    Long selectOverviewLotteryWinCount(@Param("liveIds") List<Long> liveIds);
    @DataSource(DataSourceType.SLAVE)
    Long selectOverviewPaidUserCount(@Param("liveIds") List<Long> liveIds);
    @DataSource(DataSourceType.SLAVE)
    Long selectOverviewUnpaidUserCount(@Param("liveIds") List<Long> liveIds);
    @DataSource(DataSourceType.SLAVE)
    java.math.BigDecimal selectOverviewTotalGmv(@Param("liveIds") List<Long> liveIds);
    @DataSource(DataSourceType.SLAVE)
    Long selectOverviewTotalProductQty(@Param("liveIds") List<Long> liveIds);

    /**
     * 直播趋势：查询进入直播间的原始数据（live_id, live_name, start_time, entry_time）
     * 用于计算相对时间并统计各时段累计进入人数
     */
    @DataSource(DataSourceType.SLAVE)
    List<Map<String, Object>> selectLiveEntryTrendRawData(@Param("liveIds") List<Long> liveIds);

    /**
     * 直播间学员列表（基于 live_user_first_entry）
     */
    @DataSource(DataSourceType.SLAVE)
    List<LiveRoomStudentQueryVO> selectLiveRoomStudentList(@Param("param") LiveRoomStudentParam param);

    /**
     * 商品对比统计：按商品汇总 下单未支付人数、成交人数、成交金额
     */
    @DataSource(DataSourceType.SLAVE)
    List<com.fs.live.vo.ProductCompareVO> selectProductCompareList(@Param("param") com.fs.live.param.ProductCompareParam param);

    /**
     * 邀课对比-分享人选项列表（基于 live_user_first_entry 中存在的销售）
     */
    @DataSource(DataSourceType.SLAVE)
    List<com.fs.live.vo.InviteSalesOptionVO> selectInviteSalesOptions(@Param("liveIds") List<Long> liveIds);

    /**
     * 邀课对比统计：按销售汇总 归属公司、销售名称、邀请人数、已支付订单数、订单总金额
     */
    @DataSource(DataSourceType.SLAVE)
    List<com.fs.live.vo.InviteCompareVO> selectInviteCompareList(@Param("param") com.fs.live.param.InviteCompareParam param);
}
