package com.ruoyi.excel.wecom.service;

import com.ruoyi.excel.wecom.domain.CustomerStatisticsDataV2;
import com.ruoyi.excel.wecom.domain.dto.TagTreeDTO;

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

/**
 * 客户统计数据V2 Service接口
 * 支持标签级成本，行列转换存储
 */
public interface ICustomerStatisticsDataV2Service {

    /**
     * 查询客户统计数据V2列表
     * @param corpId 企业ID
     * @param startDate 开始日期
     * @param endDate 结束日期
     * @return 客户统计数据V2列表
     */
    List<CustomerStatisticsDataV2> selectCustomerStatisticsDataV2List(
            String corpId, Date startDate, Date endDate);

    /**
     * 查询树状结构数据（组+标签）
     * @param corpId 企业ID
     * @param startDate 开始日期
     * @param endDate 结束日期
     * @return 树状结构数据列表
     */
    List<CustomerStatisticsDataV2> selectTreeData(
            String corpId, Date startDate, Date endDate);

    /**
     * 查询标签树（只返回组-标签结构，不返回统计数据）
     * @param corpId 企业ID
     * @param startDate 开始日期
     * @param endDate 结束日期
     * @return 标签树列表
     */
    List<TagTreeDTO> selectTagTree(String corpId, Date startDate, Date endDate);

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

    /**
     * 根据ID查询客户统计数据V2
     * @param id 主键ID
     * @return 客户统计数据V2
     */
    CustomerStatisticsDataV2 selectCustomerStatisticsDataV2ById(Long id);

    /**
     * 新增客户统计数据V2
     * @param data 客户统计数据V2
     * @return 结果
     */
    int insertCustomerStatisticsDataV2(CustomerStatisticsDataV2 data);

    /**
     * 修改客户统计数据V2
     * @param data 客户统计数据V2
     * @return 结果
     */
    int updateCustomerStatisticsDataV2(CustomerStatisticsDataV2 data);

    /**
     * 批量删除客户统计数据V2
     * @param ids 需要删除的数据ID
     * @return 结果
     */
    int deleteCustomerStatisticsDataV2ByIds(Long[] ids);

    /**
     * 录入成本（支持组级和标签级）
     * @param corpId 企业ID
     * @param date 日期
     * @param groupName 组名
     * @param tagName 标签名（null表示组级）
     * @param costValue 成本值
     * @param inputType 录入类型：total-总成本，single-单条成本
     * @return 结果
     */
    int inputCost(String corpId, Date date, String groupName, String tagName,
                  BigDecimal costValue, String inputType);

    /**
     * 重新计算指定日期的统计数据
     * @param corpId 企业ID
     * @param date 日期
     * @return 结果
     */
    int recalculateStatistics(String corpId, Date date);

    /**
     * 重新计算指定日期范围的统计数据
     * @param corpId 企业ID
     * @param startDate 开始日期
     * @param endDate 结束日期
     * @return 结果
     */
    int recalculateStatisticsRange(String corpId, Date startDate, Date endDate);

    /**
     * 按周聚合查询
     * @param corpId 企业ID
     * @param year 年份
     * @param week 周数
     * @param groupName 组名（可选）
     * @param tagName 标签名（可选）
     * @param onlyGroup 只看分组（可选）
     * @param onlyTag 只看标签（可选）
     * @return 聚合后的数据列表
     */
    List<CustomerStatisticsDataV2> selectByWeekAggregation(
            String corpId, Integer year, Integer week, String groupName, String tagName,
            Boolean onlyGroup, Boolean onlyTag);

    /**
     * 按月聚合查询
     * @param corpId 企业ID
     * @param yearMonth 年月（格式：yyyy-MM）
     * @param groupName 组名（可选）
     * @param tagName 标签名（可选）
     * @param onlyGroup 只看分组（可选）
     * @param onlyTag 只看标签（可选）
     * @return 聚合后的数据列表
     */
    List<CustomerStatisticsDataV2> selectByMonthAggregation(
            String corpId, String yearMonth, String groupName, String tagName,
            Boolean onlyGroup, Boolean onlyTag);

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