package com.ruoyi.excel.wecom.mapper;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.ruoyi.excel.wecom.domain.CustomerStatisticsDataV2;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;

import java.util.Date;
import java.util.List;

/**
 * 客户统计数据V2 Mapper接口
 * 支持标签级成本，行列转换存储
 */
@Mapper
public interface CustomerStatisticsDataV2Mapper extends BaseMapper<CustomerStatisticsDataV2> {

    /**
     * 根据企业ID、日期、组名、标签名查询数据
     */
    CustomerStatisticsDataV2 selectByCorpDateGroupTag(
            @Param("corpId") String corpId,
            @Param("curDate") Date curDate,
            @Param("groupName") String groupName,
            @Param("tagName") String tagName
    );

    /**
     * 查询组级数据列表
     */
    List<CustomerStatisticsDataV2> selectGroupLevelList(
            @Param("corpId") String corpId,
            @Param("startDate") Date startDate,
            @Param("endDate") Date endDate
    );

    /**
     * 查询标签级数据列表
     */
    List<CustomerStatisticsDataV2> selectTagLevelList(
            @Param("corpId") String corpId,
            @Param("startDate") Date startDate,
            @Param("endDate") Date endDate,
            @Param("groupName") String groupName
    );

    /**
     * 根据企业ID、日期、组名查询组级数据
     */
    CustomerStatisticsDataV2 selectGroupLevelByCorpDateGroup(
            @Param("corpId") String corpId,
            @Param("curDate") Date curDate,
            @Param("groupName") String groupName
    );

    /**
     * 根据企业ID、日期、组名查询标签级数据列表
     */
    List<CustomerStatisticsDataV2> selectTagLevelByCorpDateGroup(
            @Param("corpId") String corpId,
            @Param("curDate") Date curDate,
            @Param("groupName") String groupName
    );

    /**
     * 批量插入数据
     */
    int batchInsert(@Param("list") List<CustomerStatisticsDataV2> list);

    /**
     * 删除指定日期范围的数据
     */
    int deleteByDateRange(
            @Param("corpId") String corpId,
            @Param("startDate") Date startDate,
            @Param("endDate") Date endDate
    );

    /**
     * 查询树状结构数据（组+标签）
     */
    List<CustomerStatisticsDataV2> selectTreeData(
            @Param("corpId") String corpId,
            @Param("startDate") Date startDate,
            @Param("endDate") Date endDate
    );

    /**
     * 根据筛选条件查询数据列表（支持按组、标签筛选）
     * @param corpId 企业ID
     * @param startDate 开始日期
     * @param endDate 结束日期
     * @param groupName 组名（可选）
     * @param tagName 标签名（可选）
     * @param onlyGroup 只看分组（可选）
     * @param onlyTag 只看标签（可选）
     * @return 数据列表
     */
    List<CustomerStatisticsDataV2> selectListByFilter(
            @Param("corpId") String corpId,
            @Param("startDate") Date startDate,
            @Param("endDate") Date endDate,
            @Param("groupName") String groupName,
            @Param("tagName") String tagName,
            @Param("onlyGroup") Boolean onlyGroup,
            @Param("onlyTag") Boolean onlyTag
    );

    /**
     * 按日期范围聚合查询（支持按组、标签筛选）
     * @param corpId 企业ID
     * @param startDate 开始日期
     * @param endDate 结束日期
     * @param groupName 组名（可选）
     * @param tagName 标签名（可选）
     * @param onlyGroup 只看分组（可选）
     * @param onlyTag 只看标签（可选）
     * @return 聚合后的数据列表
     */
    List<CustomerStatisticsDataV2> selectAggregatedByDateRange(
            @Param("corpId") String corpId,
            @Param("startDate") Date startDate,
            @Param("endDate") Date endDate,
            @Param("groupName") String groupName,
            @Param("tagName") String tagName,
            @Param("onlyGroup") Boolean onlyGroup,
            @Param("onlyTag") Boolean onlyTag
    );

    /**
     * 查询所有数据并聚合（支持按组、标签筛选）
     * @param corpId 企业ID
     * @param groupName 组名（可选）
     * @param tagName 标签名（可选）
     * @param onlyGroup 只看分组（可选）
     * @param onlyTag 只看标签（可选）
     * @return 聚合后的数据列表
     */
    List<CustomerStatisticsDataV2> selectAllAggregated(
            @Param("corpId") String corpId,
            @Param("groupName") String groupName,
            @Param("tagName") String tagName,
            @Param("onlyGroup") Boolean onlyGroup,
            @Param("onlyTag") Boolean onlyTag
    );
}
