package com.smyhub.infogenie.infogeniebackendjava.service;

import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;

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

/**
 * Builds prompt strings and dispatches to the AIModelService for all vertical
 * AI-tool endpoints (name-analysis, variable-naming, poetry, etc.).
 * Mirrors the prompt-construction logic in the Go aimodel handler.
 */
@Service
@RequiredArgsConstructor
public class AIToolService {

    private final AIModelService aiModelService;

    public String nameAnalysis(String name) throws Exception {
        String prompt = """
                你是一个专业的姓名分析师，精通中国传统文化、五行八字和现代心理学。
                请对以下姓名进行详细分析，包括：字义解读、五行属性、性格特征、事业运势、感情运势。
                姓名：%s
                请用结构化的格式输出分析结果。
                """.formatted(name);
        return callDeepSeek(prompt);
    }

    public String variableNaming(String description, String language) throws Exception {
        String lang = (language == null || language.isBlank()) ? "通用" : language;
        String prompt = """
                你是一个专业的程序员，精通各种编程语言的命名规范。
                请为以下功能/变量描述生成合适的变量名/函数名，提供多种命名风格（camelCase、snake_case、PascalCase等）。
                编程语言：%s
                描述：%s
                请提供5-10个命名建议，并简要说明每个命名的含义。
                """.formatted(lang, description);
        return callDeepSeek(prompt);
    }

    public String poetry(String topic, String style) throws Exception {
        String styleHint = (style == null || style.isBlank()) ? "现代诗" : style;
        String prompt = """
                你是一位才华横溢的诗人，精通各种诗歌形式。
                请以"%s"为主题，创作一首%s。
                要求：意境优美，情感真挚，语言生动。
                """.formatted(topic, styleHint);
        return callDeepSeek(prompt);
    }

    public String translation(String text, String targetLanguage, String sourceLanguage) throws Exception {
        String target = (targetLanguage == null || targetLanguage.isBlank()) ? "英语" : targetLanguage;
        String source = (sourceLanguage == null || sourceLanguage.isBlank()) ? "自动检测" : sourceLanguage;
        String prompt = """
                你是一位专业翻译，精通多种语言。
                请将以下文本从%s翻译成%s，保持原文的语气、风格和文化内涵。
                原文：%s
                请提供翻译结果，如有必要可附上简短说明。
                """.formatted(source, target, text);
        return callDeepSeek(prompt);
    }

    public String classicalConversion(String text) throws Exception {
        String prompt = """
                你是一位古汉语专家，精通文言文与白话文的互译。
                请判断以下文本是文言文还是白话文，并进行相应转换：
                - 如果是白话文，请转换为文言文
                - 如果是文言文，请转换为现代白话文
                原文：%s
                请提供转换结果，并简要说明转换要点。
                """.formatted(text);
        return callDeepSeek(prompt);
    }

    public String expressionMaker(String input, String style) throws Exception {
        String tone = (style == null || style.isBlank()) ? "幽默风趣" : style;
        String prompt = """
                你是一个表达大师，擅长用各种风格表达同一个意思。
                请将以下内容用%s的风格重新表达，让表达更加生动有趣：
                原文：%s
                请提供3-5种不同的表达方式。
                """.formatted(tone, input);
        return callDeepSeek(prompt);
    }

    public String linuxCommand(String description) throws Exception {
        String prompt = """
                你是一位Linux系统专家，精通各种Shell命令和脚本。
                请根据以下描述生成对应的Linux命令：
                描述：%s
                请提供命令示例，并解释命令的各个参数含义。如果有多种实现方式，请列出常用的几种。
                """.formatted(description);
        return callDeepSeek(prompt);
    }

    public String markdownFormatting(String text) throws Exception {
        String prompt = """
                你是一位Markdown格式化专家。
                请将以下文本整理并格式化为规范的Markdown格式，合理使用标题、列表、代码块等元素：
                原文：%s
                请输出格式化后的Markdown文本。
                """.formatted(text);
        return callDeepSeek(prompt);
    }

    public String kinshipCalculator(String relationship) throws Exception {
        String prompt = """
                你是一位精通中国亲属称谓的专家。
                请解析以下亲属关系描述，给出正确的称谓：
                关系描述：%s
                请给出：1.正式称谓 2.口语称谓 3.简要说明关系链。
                """.formatted(relationship);
        return callDeepSeek(prompt);
    }

    private String callDeepSeek(String userPrompt) throws Exception {
        List<Map<String, String>> messages = List.of(
                Map.of("role", "user", "content", userPrompt)
        );
        return aiModelService.callAI(AIModelService.PROVIDER_DEEPSEEK,
                AIModelService.DEFAULT_MODEL_DEEPSEEK, messages);
    }
}
