package com.dora.service.impl;

import com.dora.dto.TaskProgressDto;
import com.dora.service.NotificationService;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.messaging.simp.SimpMessagingTemplate;
import org.springframework.stereotype.Service;

/**
 * 通知服务实现类
 * 使用WebSocket（STOMP）向用户推送AI任务的实时状态更新
 *
 * @author 1818AI
 * @since 2025-10-20
 */
@Service
@Slf4j
@RequiredArgsConstructor
public class NotificationServiceImpl implements NotificationService {

    private final SimpMessagingTemplate messagingTemplate;

    /**
     * WebSocket目标路径
     * 客户端订阅路径: /user/queue/tasks-progress
     */
    private static final String TASK_PROGRESS_DESTINATION = "/queue/tasks-progress";

    @Override
    public void sendTaskUpdateToUser(Long userId, TaskProgressDto progress) {
        if (userId == null) {
            log.warn("无法发送通知，因为用户ID为空。");
            return;
        }
        
        log.debug("向用户 {} 发送任务 {} 的进度更新到目的地: {}", 
                  userId, progress.getTaskNo(), TASK_PROGRESS_DESTINATION);
        
        try {
            messagingTemplate.convertAndSendToUser(
                String.valueOf(userId),
                TASK_PROGRESS_DESTINATION,
                progress
            );
            log.debug("WebSocket通知发送成功 - 用户: {}, 任务: {}", userId, progress.getTaskNo());
        } catch (Exception e) {
            log.error("发送WebSocket通知失败 - 用户: {}, 任务: {}", userId, progress.getTaskNo(), e);
        }
    }

    @Override
    public void notifyTaskProgress(Long userId, String taskNo, String status, Integer progress, String progressMessage) {
        if (userId == null || taskNo == null) {
            log.warn("无法发送进度通知，用户ID或任务编号为空");
            return;
        }

        TaskProgressDto progressDto = TaskProgressDto.builder()
                .taskNo(taskNo)
                .status(status)
                .progress(progress != null ? progress : 0)
                .message(progressMessage)  // 使用 message 字段
                .build();

        sendTaskUpdateToUser(userId, progressDto);
        log.info("任务进度通知已发送 - 用户: {}, 任务: {}, 状态: {}, 进度: {}%", 
                 userId, taskNo, status, progress);
    }

    @Override
    public void notifyTaskCompleted(Long userId, String taskNo, String resultUrl) {
        if (userId == null || taskNo == null) {
            log.warn("无法发送完成通知，用户ID或任务编号为空");
            return;
        }

        TaskProgressDto progressDto = TaskProgressDto.builder()
                .taskNo(taskNo)
                .status("completed")
                .progress(100)
                .message("任务已成功完成")  // 使用 message 字段
                .resultUrl(resultUrl)
                .build();

        sendTaskUpdateToUser(userId, progressDto);
        log.info("任务完成通知已发送 - 用户: {}, 任务: {}, 结果URL: {}", 
                 userId, taskNo, resultUrl);
    }

    @Override
    public void notifyTaskFailed(Long userId, String taskNo, String errorMessage) {
        if (userId == null || taskNo == null) {
            log.warn("无法发送失败通知，用户ID或任务编号为空");
            return;
        }

        TaskProgressDto progressDto = TaskProgressDto.builder()
                .taskNo(taskNo)
                .status("failed")
                .progress(0)
                .message(errorMessage != null ? errorMessage : "任务执行失败")  // 使用 message 字段
                .errorMessage(errorMessage)
                .build();

        sendTaskUpdateToUser(userId, progressDto);
        log.warn("任务失败通知已发送 - 用户: {}, 任务: {}, 错误: {}", 
                 userId, taskNo, errorMessage);
    }
}
