package com.dora.service;

import com.dora.dto.WechatManagementDto;
import com.dora.entity.WechatMenu;
import com.dora.entity.WechatMessageTemplate;
import com.dora.entity.WechatKeywordReply;

import java.util.List;
import org.springframework.web.multipart.MultipartFile;
import java.io.IOException;

/**
 * 微信公众号管理服务接口
 * 
 * @author dora
 * @date 2024/12/01
 */
public interface WechatManagementService {

    // ==================== 菜单管理 ====================

    /**
     * 获取菜单树结构
     */
    List<WechatMenu> getMenuTree();

    /**
     * 根据ID获取菜单
     */
    WechatMenu getMenuById(Long id);

    /**
     * 创建菜单
     */
    WechatMenu createMenu(WechatManagementDto.MenuCreateRequest request);

    /**
     * 更新菜单
     */
    WechatMenu updateMenu(Long id, WechatManagementDto.MenuUpdateRequest request);

    /**
     * 删除菜单（级联删除子菜单）
     */
    boolean deleteMenu(Long id);

    /**
     * 批量更新菜单状态
     */
    boolean updateMenuStatus(List<Long> ids, boolean enabled);

    /**
     * 发布菜单到微信服务器
     */
    boolean publishMenu();

    /**
     * 删除微信服务器上的菜单
     */
    boolean deleteWechatMenu();

    /**
     * 获取当前微信服务器上的菜单
     */
    WechatManagementDto.WechatMenuResponse getCurrentWechatMenu();

    // ==================== 消息模板管理 ====================

    /**
     * 分页获取消息模板列表
     */
    WechatManagementDto.TemplatePageResponse getTemplateList(WechatManagementDto.TemplateQueryRequest request);

    /**
     * 根据ID获取消息模板
     */
    WechatMessageTemplate getTemplateById(Long id);

    /**
     * 根据模板Key获取消息模板
     */
    WechatMessageTemplate getTemplateByKey(String templateKey);

    /**
     * 创建消息模板
     */
    WechatMessageTemplate createTemplate(WechatManagementDto.TemplateCreateRequest request);

    /**
     * 更新消息模板
     */
    WechatMessageTemplate updateTemplate(Long id, WechatManagementDto.TemplateUpdateRequest request);

    /**
     * 删除消息模板
     */
    boolean deleteTemplate(Long id);

    /**
     * 批量更新模板状态
     */
    boolean updateTemplateStatus(List<Long> ids, boolean enabled);

    // ==================== 关键词回复管理 ====================

    /**
     * 分页获取关键词回复列表
     */
    WechatManagementDto.KeywordReplyPageResponse getKeywordReplyList(WechatManagementDto.KeywordReplyQueryRequest request);

    /**
     * 创建关键词回复
     */
    WechatKeywordReply createKeywordReply(WechatManagementDto.KeywordReplyCreateRequest request);

    /**
     * 更新关键词回复
     */
    WechatKeywordReply updateKeywordReply(Long id, WechatManagementDto.KeywordReplyUpdateRequest request);

    /**
     * 删除关键词回复
     */
    boolean deleteKeywordReply(Long id);

    // ==================== 消息处理 ====================

    /**
     * 根据触发类型和值获取消息模板
     */
    WechatMessageTemplate getTemplateByTrigger(String triggerType, String triggerValue);

    /**
     * 根据关键词获取回复模板
     */
    WechatMessageTemplate getTemplateByKeyword(String keyword);

    /**
     * 获取默认回复模板
     */
    WechatMessageTemplate getDefaultReplyTemplate();

    /**
     * 发送模板消息
     */
    boolean sendTemplateMessage(String openid, WechatMessageTemplate template);

    // ==================== 统计分析 ====================

    /**
     * 获取管理概览统计
     */
    WechatManagementDto.ManagementOverview getManagementOverview();

    // ==================== 素材管理 ====================

    /**
     * 上传永久素材
     * @param file 文件
     * @param mediaType 素材类型 (image, voice, video, thumb)
     * @param title 视频素材标题 (仅video类型需要)
     * @param introduction 视频素材描述 (仅video类型需要)
     */
    WechatManagementDto.MediaUploadResult uploadPermanentMedia(MultipartFile file, String mediaType, String title, String introduction) throws IOException;

    /**
     * 分页获取永久素材列表
     * @param mediaType 素材类型 (image, voice, video, news)
     * @param page 页码 (从1开始)
     * @param size 每页数量 (1-20)
     */
    WechatManagementDto.MediaFilePageResponse listPermanentMedia(String mediaType, int page, int size);

    /**
     * 删除永久素材
     * @param mediaId 素材ID
     */
    boolean deletePermanentMedia(String mediaId);
}
