package dev.sonpx.loyalty.agent.service;

import dev.sonpx.loyalty.agent.domain.Conversation;
import dev.sonpx.loyalty.agent.domain.Message;
import dev.sonpx.loyalty.agent.repository.ConversationRepository;
import dev.sonpx.loyalty.agent.repository.MessageRepository;
import lombok.extern.slf4j.Slf4j;
import org.springframework.ai.chat.client.ChatClient;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Service;

import java.time.Instant;
import java.util.UUID;

@Slf4j
@Service
public class AgentPersistenceService {

    private final ConversationRepository conversationRepository;
    private final MessageRepository messageRepository;
    private final ChatClient chatChatClient;

    public AgentPersistenceService(
            ConversationRepository conversationRepository,
            MessageRepository messageRepository,
            @Qualifier("chatAgentChatClient") ChatClient chatChatClient) {
        this.conversationRepository = conversationRepository;
        this.messageRepository = messageRepository;
        this.chatChatClient = chatChatClient;
    }

    public void saveUserMessage(String conversationId, String userMessageId, String content) {
        try {
            ensureConversationExists(conversationId, content);

            Message message = Message.builder()
                    .id(userMessageId != null ? userMessageId : UUID.randomUUID().toString())
                    .conversationId(conversationId)
                    .role("user")
                    .content(content != null ? content : "")
                    .createdAt(Instant.now())
                    .build();
            messageRepository.save(message);
        } catch (Exception e) {
            log.error("Failed to save user message for conversation: {}", conversationId, e);
        }
    }

    public void saveAssistantMessage(String conversationId, String content) {
        if (content == null || content.isBlank()) {
            return;
        }
        try {
            ensureConversationExists(conversationId, null);

            Message message = Message.builder()
                    .id(UUID.randomUUID().toString())
                    .conversationId(conversationId)
                    .role("assistant")
                    .content(content)
                    .createdAt(Instant.now())
                    .build();
            messageRepository.save(message);
        } catch (Exception e) {
            log.error("Failed to save assistant message for conversation: {}", conversationId, e);
        }
    }

    private void ensureConversationExists(String conversationId, String userPromptForTitle) {
        Conversation conversation = conversationRepository.findById(conversationId)
                .orElseGet(() -> Conversation.builder()
                        .id(conversationId)
                        .title("Cuộc trò chuyện mới")
                        .createdAt(Instant.now())
                        .updatedAt(Instant.now())
                        .build());
        conversation.setUpdatedAt(Instant.now());

        if (userPromptForTitle != null && !userPromptForTitle.isBlank()) {
            if (conversation.getTitle() == null || conversation.getTitle().isBlank() || "Cuộc trò chuyện mới".equalsIgnoreCase(conversation.getTitle())) {
                String generatedTitle = generateTitleWithAgent(userPromptForTitle);
                conversation.setTitle(generatedTitle);
            }
        }

        conversationRepository.save(conversation);
    }

    private String generateTitleWithAgent(String content) {
        try {
            String prompt = "Hãy tạo 1 tiêu đề cực kỳ ngắn gọn (3 đến 6 từ), chính xác và súc tích bằng tiếng Việt đại diện cho chủ đề của tin nhắn sau. Không dùng dấu ngoặc kép, không giải thích dài dòng, chỉ trả về duy nhất tiêu đề:\n\n" + content;
            String generatedTitle = chatChatClient.prompt()
                    .user(prompt)
                    .call()
                    .content();
            if (generatedTitle != null && !generatedTitle.isBlank()) {
                generatedTitle = generatedTitle.replaceAll("^[\"']|[\"']$", "").trim();
                if (generatedTitle.length() > 60) {
                    generatedTitle = generatedTitle.substring(0, 60);
                }
                return generatedTitle;
            }
        } catch (Exception e) {
            log.warn("Failed to generate title using Agent for content, falling back: {}", e.getMessage());
        }
        return content.length() > 40 ? content.substring(0, 40) + "..." : content;
    }
}

