package com.ruoyi.clock.service;

import com.ruoyi.clock.domain.ClockRecord;
import com.ruoyi.clock.domain.bo.ActivityClockRecordBo;
import com.ruoyi.clock.domain.bo.ActivityShopSaleBo;
import com.ruoyi.clock.domain.bo.AnalysisQueryBo;
import com.ruoyi.clock.domain.bo.ClockCalendarBo;
import com.ruoyi.clock.domain.bo.SaleStatisticBo;
import com.ruoyi.clock.domain.vo.*;
import com.ruoyi.clock.domain.bo.ClockRecordBo;
import com.ruoyi.common.core.page.TableDataInfo;
import com.ruoyi.common.core.domain.PageQuery;

import java.util.Collection;
import java.util.List;

/**
 * 打卡记录信息Service接口
 *
 * @author pengc
 * @date 2026-03-04
 */
public interface IClockRecordService {

    /**
     * 查询打卡记录信息分页
     *
     * @param bo 打卡记录信息
     * @return 打卡记录信息集合
     */
    TableDataInfo<ClockRecordVo> queryPageList(ClockRecordBo bo, PageQuery pageQuery);

    /**
     * 查询打卡记录信息列表
     *
     * @param bo 打卡记录信息
     * @return 打卡记录信息集合
     */
    List<ClockRecordVo> queryList(ClockRecordBo bo);

    /**
     * 查询打卡记录信息
     *
     * @param recordId 打卡记录信息主键
     * @return 打卡记录信息
     */
    ClockRecordVo queryById(Long recordId);

    /**
     * 详情打卡记录信息
     *
     * @param recordId 打卡记录信息主键
     * @return 打卡记录信息
     */
    ClockRecord loadById(Long recordId, Boolean tw);

    /**
     * 新增打卡记录信息
     *
     * @param bo 打卡记录信息
     * @return 结果
     */
    Boolean insertByBo(ClockRecordBo bo);

    /**
     * 修改打卡记录信息
     *
     * @param bo 打卡记录信息
     * @return 结果
     */
    Boolean updateByBo(ClockRecordBo bo);

    /**
     * 校验并批量删除打卡记录信息信息
     *
     * @param ids 需要删除的打卡记录信息主键集合
     * @param isValid 是否校验,true-删除前校验,false-不校验
     * @return 结果
     */
    Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid);

    /**
     * 查询打卡次数
     * @param activityId 活动id
     * @param employeeId 员工id
     * @return
     */
    Long queryClockCount(Long activityId,Long employeeId);

    /**
     * 查询打卡统计信息
     * @param employeeId 员工id
     * @return
     */
    ClockStatisticRecordVo queryClockStatisticRecord(Long employeeId);

    /**
     * 获取销售统计信息
     * @param bo
     * @return
     */
    List<SaleStatisticRecordVo> querySaleStatisticRecordList(SaleStatisticBo bo);

    /**
     * 获取我的销售统计信息
     * @param bo
     * @return
     */
    MySaleStatisticRecordVo mySaleRank(SaleStatisticBo bo);

    /**
     * 查询我的活动打卡统计
     * @param bo
     * @return
     */
    MyActivityStatisticVo myActivityStatistic(SaleStatisticBo bo);

    /**
     * 查询打卡日历（按年月，标注每天打卡状态及详情）
     *
     * @param bo         查询条件（activityId、year、month）
     * @param employeeId 员工id
     * @return 该月每天打卡列表
     */
    List<ClockCalendarDayVo> queryCalendar(ClockCalendarBo bo, Long employeeId);

    /**
     * 打卡（每天只能打卡一次，已打卡则更新）
     * 支持晒单打卡（type=0）和销量打卡（type=1）
     *
     * @param bo         打卡记录信息（含 productList 用于销量打卡）
     * @param employeeId 员工id
     * @return 打卡记录id
     */
    Long submitClock(ClockRecordBo bo, Long employeeId);

    /**
     * 分页查询活动打卡记录列表
     *
     * @param bo        查询条件
     * @param pageQuery 分页参数
     * @return 打卡记录分页
     */
    TableDataInfo<ActivityClockRecordVo> queryActivityClockRecordPage(ActivityClockRecordBo bo, PageQuery pageQuery);

    /**
     * 查询活动打卡统计（打卡人数 + 销售数量合计）
     *
     * @param bo 查询条件
     * @return 统计结果
     */
    ActivityClockStatisticVo queryActivityClockStatistic(ActivityClockRecordBo bo);

    /**
     * 将某员工在指定活动下的所有打卡记录设为失效
     *
     * @param activityId 活动id
     * @param employeeId 员工id
     * @return 是否成功
     */
    Boolean invalidateEmployeeClock(Long activityId, Long employeeId);

    /**
     * 分页查询活动店铺销量列表（销量活动 type=1）
     *
     * @param bo        查询条件
     * @param pageQuery 分页参数
     * @return 店铺销量分页
     */
    TableDataInfo<ActivityShopSaleVo> queryActivityShopSalePage(ActivityShopSaleBo bo, PageQuery pageQuery);

    /**
     * 查询仪表板统计数据
     *
     * @return 统计数据
     */
    DashboardStatisticVo queryDashboardStatistic();

    /**
     * 查询昨日代理商活动参与人数排行
     *
     * @return 代理商排行列表
     */
    List<AgentRankVo> queryYesterdayAgentRank();

    /**
     * 查询昨日门店活动参与人数排行
     *
     * @return 门店排行列表
     */
    List<ShopRankVo> queryYesterdayShopRank();

    /**
     * 查询统计分析概览数据
     *
     * @return 概览数据
     */
    AnalysisOverviewVo queryAnalysisOverview();

    /**
     * 查询门店活跃度排行
     *
     * @param bo 查询条件（activityId 可选）
     * @return 门店活跃度排行列表
     */
    List<ShopActivityRankVo> queryShopActivityRank(AnalysisQueryBo bo);

    /**
     * 查询参与人数与销量趋势（最近30天）
     *
     * @param bo 查询条件（activityId 可选）
     * @return 趋势数据列表
     */
    List<TrendVo> queryTrend(AnalysisQueryBo bo);

    /**
     * 查询月度参与人数与销量对比（最近6个月）
     *
     * @param bo 查询条件（activityId 可选）
     * @return 月度对比数据列表
     */
    List<MonthlyComparisonVo> queryMonthlyComparison(AnalysisQueryBo bo);

    /**
     * 查询门店销量排行榜 TOP 6
     *
     * @return 门店销量排行列表
     */
    List<ShopSalesRankVo> queryShopSalesRank();

}
