package com.seer.teach.teacher.service.prompt.impl;

import com.seer.teach.common.cache.LlmAudioPublisher;
import com.seer.teach.common.dto.mq.LlmChatDTO;
import com.seer.teach.iot.api.UserDeviceServiceApi;
import com.seer.teach.teacher.common.llm.sse.req.LlmSseChatReq;
import com.seer.teach.teacher.common.llm.sse.req.Message;
import com.seer.teach.teacher.common.llm.sse.req.Text;
import com.seer.teach.teacher.common.utils.TeacherUtils;
import com.seer.teach.teacher.processor.chat.WelcomeMessagesStreamProcessor;
import com.seer.teach.teacher.service.LlmSseService;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import reactor.core.publisher.Flux;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;

/**
 * <p>
 * 日常问候服务实现类，用于处理设备开机时向用户发送问候语的逻辑。
 * 该类继承自 {@link BasePromptService}，并实现了与大语言模型（LLM）交互、推送问候音频等功能。
 * </p>
 *
 * @author Captain
 * @since 2025-10-28 14:55
 */
@Slf4j
@Service
@RequiredArgsConstructor
public class WelcomeMessagesServiceImpl extends BasePromptService {

    private final LlmSseService llmSseService;

    private final UserDeviceServiceApi userDeviceServiceApi;

    private final WelcomeMessagesStreamProcessor welcomeMessagesStreamProcessor;

    /**
     * 获取当前模块名称。
     *
     * @return 模块名称 "dailyWelcome"
     */
    @Override
    public String getModule() {
        return "dailyWelcome";
    }

    /**
     * 获取当前功能名称。
     *
     * @return 功能名称 "开机问候"
     */
    @Override
    public String getFunctionName() {
        return "开机问候";
    }

    /**
     * 获取角色ID。
     *
     * @return 角色ID：1（教师）
     */
    @Override
    public Integer getRoleId() {
        return 1;
    }

    /**
     * 执行日常问候流程。根据设备获取用户ID，构造问候消息，调用LLM生成语音流，并将结果推送给设备。
     *
     * @param device 设备标识符，用于识别目标设备及用户
     */
    public void dailyWelcome(String device) {
        // 获取设备绑定的用户ID
        Integer userId = userDeviceServiceApi.getUserIdByDevice(device);
        Map<String, List<Text>> prompt = super.generatePromptMessages();
        List<Message> messages = new ArrayList<>();
        prompt.forEach((role, contentList) -> {
            messages.add(new Message(role, contentList));
        });
        // 构造问候语消息列表
        // 生成会话ID
        Integer sessionId = TeacherUtils.generateSessionId(userId, messages);
        // 获取音频通道名称
        String channelName = LlmAudioPublisher.getChannel(device + sessionId);
        // 调用AI聊天接口，获取流式响应
        LlmSseChatReq llmReq = new LlmSseChatReq(sessionId, userId, messages);
        Flux<LlmChatDTO> llmFlux = llmSseService.aiChat(llmReq);
        welcomeMessagesStreamProcessor.process(userId,llmReq, device, llmFlux, channelName);
    }

}
