package org.xyzh.message.controller;


import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import org.xyzh.api.message.MessageService;
import org.xyzh.common.core.domain.ResultDomain;
import org.xyzh.common.core.page.PageParam;
import org.xyzh.common.core.page.PageRequest;
import org.xyzh.common.dto.message.*;

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

/**
 * 消息控制器
 *
 * @description 消息通知模块的REST API接口
 * @filename MessageController.java
 * @author Claude
 * @copyright xyzh
 * @since 2025-11-13
 */

@RestController
@RequestMapping("/message")
public class MessageController {
    private static final Logger logger = LoggerFactory.getLogger(MessageController.class);
    @Autowired
    private MessageService messageService;

    // ================== 消息管理接口（管理端） ==================

    /**
     * 创建消息
     *
     * @param message 消息对象
     * @return ResultDomain<TbSysMessage>
     */
    @PostMapping
    public ResultDomain<TbSysMessage> createMessage(@RequestBody TbSysMessage message) {
        logger.info("创建消息：{}", message.getTitle());
        return messageService.createMessage(message);
    }

    /**
     * 更新消息（仅草稿状态）
     *
     * @param message 消息对象
     * @return ResultDomain<TbSysMessage>
     */
    @PutMapping
    public ResultDomain<TbSysMessage> updateMessage(@RequestBody TbSysMessage message) {
        logger.info("更新消息：{}", message.getMessageID());
        return messageService.updateMessage(message);
    }

    /**
     * 删除消息
     *
     * @param messageID 消息ID
     * @return ResultDomain<TbSysMessage>
     */
    @DeleteMapping
    public ResultDomain<TbSysMessage> deleteMessage(@RequestBody TbSysMessage message) {
        return messageService.deleteMessage(message.getMessageID());
    }

    /**
     * 查询消息详情
     *
     * @param messageID 消息ID
     * @return ResultDomain<MessageVO>
     */
    @GetMapping("/detail/{messageID}")
    public ResultDomain<MessageVO> getMessageById(@PathVariable String messageID) {
        return messageService.getMessageById(messageID);
    }

    /**
     * 分页查询消息列表（管理端）
     *
     * @param filter 过滤条件
     * @param pageParam 分页参数
     * @return ResultDomain<MessageVO>
     */
    @PostMapping("/page")
    public ResultDomain<MessageVO> getMessagePage(@RequestBody TbSysMessage filter, PageParam pageParam) {
        return messageService.getMessagePage(filter, pageParam);
    }



    // ================== 消息发送接口 ==================

    /**
     * 发送消息
     *
     * @param messageID 消息ID
     * @return ResultDomain<TbSysMessage>
     */
    @PostMapping("/send/{messageID}")
    public ResultDomain<TbSysMessage> sendMessage(@PathVariable String messageID) {
        logger.info("发送消息：{}", messageID);
        return messageService.sendMessage(messageID);
    }

    /**
     * 立即发送（定时消息改为立即发送）
     *
     * @param messageID 消息ID
     * @return ResultDomain<TbSysMessage>
     */
    @PostMapping("/sendNow/{messageID}")
    public ResultDomain<TbSysMessage> sendNow(@PathVariable String messageID) {
        logger.info("立即发送消息：{}", messageID);
        return messageService.sendNow(messageID);
    }

    /**
     * 取消定时消息
     *
     * @param messageID 消息ID
     * @return ResultDomain<TbSysMessage>
     */
    @PostMapping("/cancel/{messageID}")
    public ResultDomain<TbSysMessage> cancelMessage(@PathVariable String messageID) {
        logger.info("取消消息：{}", messageID);
        return messageService.cancelMessage(messageID);
    }

    /**
     * 修改定时发送时间
     *
     * @param messageID 消息ID
     * @param request 包含scheduledTime的请求对象
     * @return ResultDomain<TbSysMessage>
     */
    @PutMapping("/reschedule/{messageID}")
    public ResultDomain<TbSysMessage> rescheduleMessage(@PathVariable String messageID,
                                                        @RequestBody Map<String, Object> request) {
        logger.info("修改消息发送时间：{}", messageID);
        Date scheduledTime = (Date) request.get("scheduledTime");
        return messageService.rescheduleMessage(messageID, scheduledTime);
    }

    /**
     * 重试失败消息
     *
     * @param messageID 消息ID
     * @return ResultDomain<TbSysMessage>
     */
    @PostMapping("/retry/{messageID}")
    public ResultDomain<TbSysMessage> retryMessage(@PathVariable String messageID) {
        logger.info("重试消息：{}", messageID);
        return messageService.retryMessage(messageID);
    }

    // ================== 用户消息接口（用户端） ==================

    /**
     * 分页查询我的消息列表
     *
     * @param filter 过滤条件
     * @param pageParam 分页参数
     * @return ResultDomain<MessageUserVO>
     */
    @PostMapping("/my/page")
    public ResultDomain<MessageUserVO> getMyMessagesPage(@RequestBody PageRequest<MessageUserVO> pageRequest) {
        return messageService.getMyMessagesPage(pageRequest.getFilter(), pageRequest.getPageParam());
    }

    /**
     * 查询我的消息详情
     *
     * @param messageID 消息ID
     * @return ResultDomain<MessageUserVO>
     */
    @GetMapping("/my/detail/{messageID}")
    public ResultDomain<MessageUserVO> getMyMessageDetail(@PathVariable String messageID) {
        return messageService.getMyMessageDetail(messageID);
    }

    /**
     * 标记消息为已读
     *
     * @param messageID 消息ID
     * @return ResultDomain<TbSysMessageUser>
     */
    @PostMapping("/my/markRead/{messageID}")
    public ResultDomain<TbSysMessageUser> markAsRead(@PathVariable String messageID) {
        return messageService.markAsRead(messageID);
    }

    /**
     * 批量标记消息为已读
     *
     * @param request 包含messageIDs的请求对象
     * @return ResultDomain<Integer>
     */
    @PostMapping("/my/batchMarkRead")
    public ResultDomain<Integer> batchMarkAsRead(@RequestBody Map<String, List<String>> request) {
        List<String> messageIDs = request.get("messageIDs");
        return messageService.batchMarkAsRead(messageIDs);
    }

    /**
     * 获取未读消息数量
     *
     * @return ResultDomain<Integer>
     */
    @GetMapping("/my/unreadCount")
    public ResultDomain<Integer> getUnreadCount() {
        return messageService.getUnreadCount();
    }

    // ================== 辅助接口 ==================

    /**
     * 获取可选的部门树
     *
     * @return ResultDomain<Map>
     */
    @GetMapping("/targets/depts")
    public ResultDomain<Map<String, Object>> getTargetDepts() {
        return messageService.getTargetDepts();
    }

    /**
     * 获取可选的角色列表
     *
     * @return ResultDomain<Map>
     */
    @GetMapping("/targets/roles")
    public ResultDomain<Map<String, Object>> getTargetRoles() {
        return messageService.getTargetRoles();
    }

    /**
     * 获取可选的用户列表
     *
     * @return ResultDomain<Map>
     */
    @GetMapping("/targets/users")
    public ResultDomain<Map<String, Object>> getTargetUsers() {
        return messageService.getTargetUsers();
    }
}
