package com.haha.service;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.haha.entity.InviteRecord;
import com.haha.entity.dto.InviteRecordQueryDTO;
import com.haha.entity.dto.UnifiedActivityCreateDTO;
import com.haha.entity.dto.UnifiedActivityQueryDTO;
import com.haha.entity.dto.UnifiedActivityUpdateDTO;
import com.haha.entity.vo.UnifiedActivityVO;

import java.util.Map;

/**
 * 统一活动服务接口
 * 作为前端和后端之间的中间层，负责将不同类型活动的 CRUD 操作分发到对应的具体服务实现
 *
 * <p>支持的活动类型：
 * <ul>
 *   <li>1 - 首单立减（营销活动）</li>
 *   <li>2 - 优惠折扣（营销活动）</li>
 *   <li>3 - 商品满减（营销活动）</li>
 *   <li>4 - 邀请有礼（邀请活动）</li>
 * </ul>
 *
 * <p>设计原则：
 * <ul>
 *   <li>统一入口：所有活动操作通过此接口进行</li>
 *   <li>类型分发：根据 activityType 自动路由到对应的 Service</li>
 *   <li>统一返回：使用 UnifiedActivityVO 统一返回格式</li>
 *   <li>透明转换：隐藏底层表结构差异</li>
 * </ul>
 */
public interface UnifiedActivityService {

    // ==================== 统一 CRUD 操作 ====================

    /**
     * 统一创建活动
     * 根据 activityType 自动分发到 MarketingActivityService 或 InviteActivityService
     *
     * @param dto 统一创建请求DTO（包含 activityType 字段用于类型判断）
     * @return 创建成功后的活动ID
     */
    Long create(UnifiedActivityCreateDTO dto);

    /**
     * 统一更新活动
     * 根据 type 参数自动分发到对应的服务
     *
     * @param dto 统一更新请求DTO（包含 id 和 type 字段）
     */
    void update(UnifiedActivityUpdateDTO dto);

    /**
     * 统一分页查询（聚合两种活动）
     * 支持按 activityType 筛选特定类型的活动，或查询全部活动
     *
     * @param queryDTO 查询条件（包含分页参数和筛选条件）
     * @return 分页结果，统一转换为 UnifiedActivityVO 格式
     */
    IPage<UnifiedActivityVO> getPage(UnifiedActivityQueryDTO queryDTO);

    /**
     * 统一详情查询
     * 根据 type 参数从对应的服务获取详情并转换为统一格式
     *
     * @param id   活动ID
     * @param type 活动类型（1-4）
     * @return 活动详情（统一VO格式）
     */
    UnifiedActivityVO getDetail(Long id, Integer type);

    // ==================== 统一状态管理 ====================

    /**
     * 发布活动
     * 将活动从草稿状态变更为已发布/进行中状态
     *
     * @param id   活动ID
     * @param type 活动类型（1-4）
     */
    void publish(Long id, Integer type);

    /**
     * 暂停活动
     * 将活动从进行中状态变更为已暂停状态
     *
     * @param id   活动ID
     * @param type 活动类型（1-4）
     */
    void pause(Long id, Integer type);

    /**
     * 恢复活动
     * 将活动从暂停状态恢复为进行中状态
     *
     * @param id   活动ID
     * @param type 活动类型（1-4）
     */
    void resume(Long id, Integer type);

    // ==================== 删除操作 ====================

    /**
     * 删除活动（逻辑删除）
     *
     * @param id   活动ID
     * @param type 活动类型（1-4）
     */
    void delete(Long id, Integer type);

    // ==================== 邀请活动特有方法 ====================

    /**
     * 分页查询邀请记录列表（仅当 type=4 时调用）
     * 获取指定邀请活动的邀请记录详情
     *
     * @param activityId 邀请活动ID
     * @param queryDTO   查询条件（包含分页参数和筛选条件）
     * @return 邀请记录分页结果
     */
    IPage<InviteRecord> getInviteRecords(Long activityId, InviteRecordQueryDTO queryDTO);

    /**
     * 获取邀请活动统计数据（仅当 type=4 时调用）
     * 包含总邀请数、有效邀请数、今日邀请数、奖励发放统计等
     *
     * @param activityId 邀请活动ID
     * @return 统计数据Map
     */
    Map<String, Object> getInviteStatistics(Long activityId);
}
