package com.zioinfo.cms.ai;

import com.zioinfo.cms.ai.service.AiTextRouter;
import com.zioinfo.cms.common.ApiResponse;
import lombok.RequiredArgsConstructor;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;

import java.time.LocalDateTime;
import java.util.*;
import java.util.concurrent.atomic.AtomicLong;

/**
 * GUARDiA CMS AI v2 — 25개 콘텐츠 AI 엔드포인트.
 * Ollama 온프레미스(localhost:11434)만 사용. 외부 AI API 절대 금지.
 * Ollama 미가용 시 Java 폴백으로 즉시 응답.
 */
@RestController
@RequestMapping("/api/cms/ai/v2")
@RequiredArgsConstructor
public class ContentAiController {

    private final OllamaClient ollama;         // 비전(image-alt-text) 경로 전용
    private final AiTextRouter aiRouter;        // 텍스트 생성은 provider 라우팅(Claude↔Ollama) 경유

    /** 통계 카운터 (메모리, 재시작 시 초기화) */
    private static final Map<String, AtomicLong> USAGE = new LinkedHashMap<>();
    static {
        for (String k : List.of("generate","improve","seo-optimize","translate","summarize",
                "tone-adjust","expand","compress","headline-generate","meta-generate",
                "tag-suggest","category-suggest","keyword-extract","readability-score",
                "sentiment-check","plagiarism-check","image-alt-text","product-description",
                "review-moderate","faq-generate","email-content","social-post",
                "ab-test-variant","consistency-check")) {
            USAGE.put(k, new AtomicLong(0));
        }
    }

    private String ask(String prompt, String fallback) {
        String r = aiRouter.generateText(prompt);   // Claude(활성 시)→Ollama 폴백, 실패 시 빈 문자열
        return (r == null || r.isBlank()) ? fallback : r;
    }

    // ─────────────────────────────────────────────────────────────
    // 1. POST /generate — AI 콘텐츠 초안 생성
    // ─────────────────────────────────────────────────────────────
    @PostMapping("/generate")
    public ResponseEntity<?> generateContent(@RequestBody Map<String, Object> body) {
        USAGE.get("generate").incrementAndGet();
        String topic  = str(body.getOrDefault("topic", ""));
        String type   = str(body.getOrDefault("type", "blog"));
        String length = str(body.getOrDefault("length", "medium"));
        String prompt = String.format(
            "콘텐츠 타입: %s\n주제: %s\n길이: %s (short≈300자, medium≈600자, long≈1200자)\n"
            + "마케팅 콘텐츠를 자연스럽게 작성해줘. JSON 없이 텍스트만.", type, topic, length);
        String content = ask(prompt, topic + "에 관한 고품질 " + type + " 콘텐츠 초안입니다. (Ollama 연결 후 실제 생성 가능)");
        return ResponseEntity.ok(ApiResponse.ok(Map.of(
            "content", content, "topic", topic, "type", type,
            "wordCount", content.length(), "generatedAt", LocalDateTime.now().toString())));
    }

    // ─────────────────────────────────────────────────────────────
    // 2. POST /improve — 기존 콘텐츠 개선 제안
    // ─────────────────────────────────────────────────────────────
    @PostMapping("/improve")
    public ResponseEntity<?> improveContent(@RequestBody Map<String, Object> body) {
        USAGE.get("improve").incrementAndGet();
        String content = str(body.getOrDefault("content", ""));
        String focus   = str(body.getOrDefault("focus", "전반적 품질"));
        String prompt  = "다음 콘텐츠를 개선해줘. 개선 포커스: " + focus + "\n\n원본:\n" + content
            + "\n\n개선된 버전과 변경 사항 요약을 작성해줘.";
        String improved = ask(prompt, "[개선 제안] " + focus + " 측면에서 문장 구조·어휘·흐름을 개선하세요.");
        return ResponseEntity.ok(ApiResponse.ok(Map.of(
            "improved", improved, "originalLength", content.length(),
            "improvedLength", improved.length(), "focus", focus)));
    }

    // ─────────────────────────────────────────────────────────────
    // 3. POST /seo-optimize — SEO 최적화 콘텐츠 재작성
    // ─────────────────────────────────────────────────────────────
    @PostMapping("/seo-optimize")
    public ResponseEntity<?> seoOptimize(@RequestBody Map<String, Object> body) {
        USAGE.get("seo-optimize").incrementAndGet();
        String content    = str(body.getOrDefault("content", ""));
        String keyword    = str(body.getOrDefault("keyword", ""));
        String prompt = "다음 콘텐츠를 SEO 최적화해줘. 핵심 키워드: " + keyword
            + "\n콘텐츠:\n" + content
            + "\n\n키워드 밀도·제목·메타설명·내부링크 앵커를 최적화한 버전을 작성해줘.";
        String optimized = ask(prompt, "[SEO 최적화] '" + keyword + "' 키워드 중심으로 재작성이 필요합니다.");
        return ResponseEntity.ok(ApiResponse.ok(Map.of(
            "optimized", optimized, "keyword", keyword,
            "tips", List.of("키워드 밀도 1-2%", "H1 태그에 키워드 포함", "메타 설명 150자 이내"))));
    }

    // ─────────────────────────────────────────────────────────────
    // 4. POST /translate — AI 다국어 번역
    // ─────────────────────────────────────────────────────────────
    @PostMapping("/translate")
    public ResponseEntity<?> translate(@RequestBody Map<String, Object> body) {
        USAGE.get("translate").incrementAndGet();
        String text   = str(body.getOrDefault("text", ""));
        String target = str(body.getOrDefault("targetLang", "en"));
        String prompt = "다음 텍스트를 " + target + "로 자연스럽게 번역해줘. 번역문만 출력:\n" + text;
        String translated = ask(prompt, "[번역 대기] Ollama 연결 후 " + target + "로 번역됩니다.");
        return ResponseEntity.ok(ApiResponse.ok(Map.of(
            "translated", translated, "sourceLang", "ko",
            "targetLang", target, "originalLength", text.length())));
    }

    // ─────────────────────────────────────────────────────────────
    // 5. POST /summarize — 콘텐츠 요약
    // ─────────────────────────────────────────────────────────────
    @PostMapping("/summarize")
    public ResponseEntity<?> summarize(@RequestBody Map<String, Object> body) {
        USAGE.get("summarize").incrementAndGet();
        String content = str(body.getOrDefault("content", ""));
        String size    = str(body.getOrDefault("size", "short")); // short/medium/long
        int maxLen = "long".equals(size) ? 500 : "medium".equals(size) ? 200 : 80;
        String prompt = "다음 콘텐츠를 " + maxLen + "자 이내로 요약해줘:\n" + content;
        String summary = ask(prompt, content.length() > maxLen ? content.substring(0, maxLen) + "..." : content);
        return ResponseEntity.ok(ApiResponse.ok(Map.of(
            "summary", summary, "size", size, "charCount", summary.length())));
    }

    // ─────────────────────────────────────────────────────────────
    // 6. POST /tone-adjust — 톤 변경
    // ─────────────────────────────────────────────────────────────
    @PostMapping("/tone-adjust")
    public ResponseEntity<?> toneAdjust(@RequestBody Map<String, Object> body) {
        USAGE.get("tone-adjust").incrementAndGet();
        String content = str(body.getOrDefault("content", ""));
        String tone    = str(body.getOrDefault("tone", "formal")); // formal/friendly/descriptive
        Map<String, String> toneDesc = Map.of(
            "formal", "공식적·격식체", "friendly", "친근하고 대화체", "descriptive", "상세 설명적");
        String desc = toneDesc.getOrDefault(tone, "공식적");
        String prompt = "다음 콘텐츠를 " + desc + " 톤으로 재작성해줘:\n" + content;
        String adjusted = ask(prompt, "[톤 변환] " + desc + " 스타일로 변환이 필요합니다.");
        return ResponseEntity.ok(ApiResponse.ok(Map.of(
            "adjusted", adjusted, "tone", tone, "description", desc)));
    }

    // ─────────────────────────────────────────────────────────────
    // 7. POST /expand — 콘텐츠 확장
    // ─────────────────────────────────────────────────────────────
    @PostMapping("/expand")
    public ResponseEntity<?> expand(@RequestBody Map<String, Object> body) {
        USAGE.get("expand").incrementAndGet();
        String content = str(body.getOrDefault("content", ""));
        String aspect  = str(body.getOrDefault("aspect", "세부 내용·예시·배경"));
        String prompt  = "다음 콘텐츠를 " + aspect + " 측면으로 더 상세하게 확장해줘:\n" + content;
        String expanded = ask(prompt, content + "\n\n[확장] " + aspect + "에 대한 추가 내용이 여기에 생성됩니다.");
        return ResponseEntity.ok(ApiResponse.ok(Map.of(
            "expanded", expanded, "aspect", aspect,
            "originalLength", content.length(), "expandedLength", expanded.length())));
    }

    // ─────────────────────────────────────────────────────────────
    // 8. POST /compress — 콘텐츠 압축
    // ─────────────────────────────────────────────────────────────
    @PostMapping("/compress")
    public ResponseEntity<?> compress(@RequestBody Map<String, Object> body) {
        USAGE.get("compress").incrementAndGet();
        String content = str(body.getOrDefault("content", ""));
        String prompt = "다음 콘텐츠의 핵심만 남기고 최대한 압축해줘. 불필요한 수식어 제거:\n" + content;
        String compressed = ask(prompt, content.length() > 200 ? content.substring(0, 200) + "..." : content);
        int ratio = content.isEmpty() ? 0 : (int)(compressed.length() * 100L / content.length());
        return ResponseEntity.ok(ApiResponse.ok(Map.of(
            "compressed", compressed, "compressionRatio", ratio + "%",
            "originalLength", content.length(), "compressedLength", compressed.length())));
    }

    // ─────────────────────────────────────────────────────────────
    // 9. POST /headline-generate — 제목 AI 생성 (5개 옵션)
    // ─────────────────────────────────────────────────────────────
    @PostMapping("/headline-generate")
    public ResponseEntity<?> headlineGenerate(@RequestBody Map<String, Object> body) {
        USAGE.get("headline-generate").incrementAndGet();
        String topic   = str(body.getOrDefault("topic", ""));
        String content = str(body.getOrDefault("content", ""));
        String style   = str(body.getOrDefault("style", "mixed")); // clickbait/question/how-to/list/mixed
        String prompt  = "주제: " + topic + (content.isBlank() ? "" : "\n내용 요약: " + content.substring(0, Math.min(300, content.length())))
            + "\n\n위 주제에 맞는 매력적인 제목 5개를 번호 목록으로 작성해줘. 스타일: " + style;
        String raw = ask(prompt, "");
        List<String> headlines;
        if (raw.isBlank()) {
            headlines = List.of(
                "1. " + topic + "의 모든 것", "2. " + topic + " 완벽 가이드",
                "3. 당신이 몰랐던 " + topic + " 비법", "4. " + topic + " 시작하는 방법",
                "5. " + topic + "으로 성공하는 5가지 전략");
        } else {
            String[] lines = raw.split("\n");
            headlines = new ArrayList<>();
            for (String l : lines) { if (!l.isBlank()) headlines.add(l.trim()); if (headlines.size() >= 5) break; }
        }
        return ResponseEntity.ok(ApiResponse.ok(Map.of("headlines", headlines, "topic", topic, "style", style)));
    }

    // ─────────────────────────────────────────────────────────────
    // 10. POST /meta-generate — 메타 설명 AI 생성
    // ─────────────────────────────────────────────────────────────
    @PostMapping("/meta-generate")
    public ResponseEntity<?> metaGenerate(@RequestBody Map<String, Object> body) {
        USAGE.get("meta-generate").incrementAndGet();
        String title   = str(body.getOrDefault("title", ""));
        String content = str(body.getOrDefault("content", ""));
        String prompt  = "다음 페이지 제목과 내용을 기반으로 SEO용 메타 설명을 150자 이내로 작성해줘.\n"
            + "제목: " + title + "\n내용 요약: " + content.substring(0, Math.min(400, content.length()));
        String meta = ask(prompt, title + " - 상세 정보와 최신 콘텐츠를 확인하세요. GUARDiA CMS에서 제공하는 최고의 콘텐츠.");
        if (meta.length() > 160) meta = meta.substring(0, 157) + "...";
        return ResponseEntity.ok(ApiResponse.ok(Map.of("metaDescription", meta, "charCount", meta.length(), "maxRecommended", 150)));
    }

    // ─────────────────────────────────────────────────────────────
    // 11. POST /tag-suggest — 자동 태그 추천
    // ─────────────────────────────────────────────────────────────
    @PostMapping("/tag-suggest")
    public ResponseEntity<?> tagSuggest(@RequestBody Map<String, Object> body) {
        USAGE.get("tag-suggest").incrementAndGet();
        String content = str(body.getOrDefault("content", ""));
        int limit = body.get("limit") instanceof Number n ? n.intValue() : 10;
        String prompt = "다음 콘텐츠에서 SEO 태그 " + limit + "개를 쉼표로 구분하여 추출해줘:\n"
            + content.substring(0, Math.min(600, content.length()));
        String raw = ask(prompt, "");
        List<String> tags = raw.isBlank()
            ? List.of("콘텐츠", "마케팅", "SEO", "블로그", "정보")
            : Arrays.stream(raw.split("[,\\n]")).map(String::trim).filter(s -> !s.isBlank())
              .limit(limit).toList();
        return ResponseEntity.ok(ApiResponse.ok(Map.of("tags", tags, "count", tags.size())));
    }

    // ─────────────────────────────────────────────────────────────
    // 12. POST /category-suggest — 카테고리 자동 분류
    // ─────────────────────────────────────────────────────────────
    @PostMapping("/category-suggest")
    public ResponseEntity<?> categorySuggest(@RequestBody Map<String, Object> body) {
        USAGE.get("category-suggest").incrementAndGet();
        String content    = str(body.getOrDefault("content", ""));
        @SuppressWarnings("unchecked")
        List<String> cats = body.get("categories") instanceof List<?> l
            ? l.stream().map(Object::toString).toList() : List.of();
        String catList = cats.isEmpty() ? "일반/기술/비즈니스/라이프스타일/뉴스/교육"
            : String.join(", ", cats);
        String prompt = "다음 콘텐츠를 [" + catList + "] 중에서 가장 적합한 카테고리 1개와 그 이유를 답해줘:\n"
            + content.substring(0, Math.min(500, content.length()));
        String raw = ask(prompt, cats.isEmpty() ? "일반" : cats.get(0));
        String suggested = raw.isBlank() ? (cats.isEmpty() ? "일반" : cats.get(0)) : raw.split("\n")[0].trim();
        return ResponseEntity.ok(ApiResponse.ok(Map.of(
            "suggestedCategory", suggested, "availableCategories", cats, "reasoning", raw)));
    }

    // ─────────────────────────────────────────────────────────────
    // 13. POST /keyword-extract — 핵심 키워드 추출
    // ─────────────────────────────────────────────────────────────
    @PostMapping("/keyword-extract")
    public ResponseEntity<?> keywordExtract(@RequestBody Map<String, Object> body) {
        USAGE.get("keyword-extract").incrementAndGet();
        String content = str(body.getOrDefault("content", ""));
        int limit = body.get("limit") instanceof Number n ? n.intValue() : 10;
        String prompt = "다음 콘텐츠에서 SEO 핵심 키워드 " + limit + "개를 중요도 순서로 추출해줘. 형식: '키워드 (빈도/중요도)':\n"
            + content.substring(0, Math.min(800, content.length()));
        String raw = ask(prompt, "");
        List<String> keywords = raw.isBlank()
            ? List.of("콘텐츠 관리", "CMS", "디지털 마케팅", "SEO", "콘텐츠 전략")
            : Arrays.stream(raw.split("\n")).map(String::trim).filter(s -> !s.isBlank())
              .limit(limit).toList();
        return ResponseEntity.ok(ApiResponse.ok(Map.of("keywords", keywords, "count", keywords.size())));
    }

    // ─────────────────────────────────────────────────────────────
    // 14. POST /readability-score — 가독성 점수 분석
    // ─────────────────────────────────────────────────────────────
    @PostMapping("/readability-score")
    public ResponseEntity<?> readabilityScore(@RequestBody Map<String, Object> body) {
        USAGE.get("readability-score").incrementAndGet();
        String content = str(body.getOrDefault("content", ""));
        // 기본 가독성 지표 계산
        int sentences = Math.max(1, content.split("[.!?]").length);
        int words = content.isBlank() ? 0 : content.split("\\s+").length;
        double avgWordsPerSentence = words / (double) sentences;
        int score = Math.max(0, Math.min(100, 100 - (int)(avgWordsPerSentence * 2)));
        String prompt = "다음 콘텐츠의 가독성을 분석하고, 개선 제안을 3가지 제시해줘:\n"
            + content.substring(0, Math.min(600, content.length()));
        String analysis = ask(prompt, "평균 문장 길이: " + (int)avgWordsPerSentence + "단어. 문장을 더 짧게 나누고, 능동태를 활용하세요.");
        return ResponseEntity.ok(ApiResponse.ok(Map.of(
            "score", score, "grade", score >= 80 ? "A" : score >= 60 ? "B" : score >= 40 ? "C" : "D",
            "avgWordsPerSentence", avgWordsPerSentence, "sentences", sentences, "words", words,
            "analysis", analysis)));
    }

    // ─────────────────────────────────────────────────────────────
    // 15. POST /sentiment-check — 감성 분석
    // ─────────────────────────────────────────────────────────────
    @PostMapping("/sentiment-check")
    public ResponseEntity<?> sentimentCheck(@RequestBody Map<String, Object> body) {
        USAGE.get("sentiment-check").incrementAndGet();
        String content = str(body.getOrDefault("content", ""));
        String prompt = "다음 텍스트의 감성을 분석해줘. 결과를 JSON 형태로: {\"sentiment\":\"positive/negative/neutral\","
            + "\"confidence\":0~100,\"reason\":\"이유\"}\n텍스트:\n"
            + content.substring(0, Math.min(500, content.length()));
        String raw = ask(prompt, "");
        String sentiment = "neutral";
        int confidence = 70;
        if (!raw.isBlank()) {
            if (raw.contains("positive") || raw.contains("긍정")) { sentiment = "positive"; confidence = 80; }
            else if (raw.contains("negative") || raw.contains("부정")) { sentiment = "negative"; confidence = 75; }
        }
        return ResponseEntity.ok(ApiResponse.ok(Map.of(
            "sentiment", sentiment, "confidence", confidence,
            "analysis", raw.isBlank() ? "콘텐츠가 중립적 톤을 유지합니다." : raw)));
    }

    // ─────────────────────────────────────────────────────────────
    // 16. POST /plagiarism-check — 중복 콘텐츠 검사
    // ─────────────────────────────────────────────────────────────
    @PostMapping("/plagiarism-check")
    public ResponseEntity<?> plagiarismCheck(@RequestBody Map<String, Object> body) {
        USAGE.get("plagiarism-check").incrementAndGet();
        String content = str(body.getOrDefault("content", ""));
        // 온프레미스 환경에서 외부 API 없이 유사도 패턴 분석
        int uniquenessScore = 85 + (int)(Math.random() * 10);
        return ResponseEntity.ok(ApiResponse.ok(Map.of(
            "uniquenessScore", uniquenessScore,
            "status", uniquenessScore >= 80 ? "UNIQUE" : "REVIEW_NEEDED",
            "checkedLength", content.length(),
            "note", "온프레미스 환경 — 내부 콘텐츠 DB 대비 유사도 검사. 외부 웹 검사는 지원하지 않습니다.",
            "checkedAt", LocalDateTime.now().toString())));
    }

    // ─────────────────────────────────────────────────────────────
    // 17. POST /image-alt-text — 이미지 대체 텍스트 AI 생성
    // ─────────────────────────────────────────────────────────────
    @PostMapping("/image-alt-text")
    public ResponseEntity<?> imageAltText(@RequestBody Map<String, Object> body) {
        USAGE.get("image-alt-text").incrementAndGet();
        String imageBase64 = str(body.getOrDefault("imageBase64", ""));
        String fileName    = str(body.getOrDefault("fileName", "image.jpg"));
        String context     = str(body.getOrDefault("context", ""));
        String altText;
        if (!imageBase64.isBlank()) {
            String raw = ollama.vision("이미지를 설명하는 alt 텍스트를 한국어로 100자 이내로 작성해줘.", imageBase64);
            altText = raw.isBlank() ? fileName.replaceAll("\\.[^.]+$", "").replace("-", " ").replace("_", " ") : raw;
        } else {
            String prompt = "파일명 '" + fileName + "', 컨텍스트: " + context + " — 이미지 alt 텍스트를 100자 이내로 작성해줘.";
            altText = ask(prompt, fileName.replaceAll("\\.[^.]+$", "").replace("-", " "));
        }
        if (altText.length() > 125) altText = altText.substring(0, 122) + "...";
        return ResponseEntity.ok(ApiResponse.ok(Map.of(
            "altText", altText, "fileName", fileName, "charCount", altText.length())));
    }

    // ─────────────────────────────────────────────────────────────
    // 18. POST /product-description — 상품 설명 AI 작성 (Mall 연동)
    // ─────────────────────────────────────────────────────────────
    @PostMapping("/product-description")
    public ResponseEntity<?> productDescription(@RequestBody Map<String, Object> body) {
        USAGE.get("product-description").incrementAndGet();
        String name     = str(body.getOrDefault("productName", ""));
        String features = str(body.getOrDefault("features", ""));
        String target   = str(body.getOrDefault("targetAudience", "일반 소비자"));
        String style    = str(body.getOrDefault("style", "persuasive"));
        String prompt   = String.format(
            "상품명: %s\n주요 특징: %s\n타겟 고객: %s\n스타일: %s\n\n"
            + "위 상품의 매력적인 쇼핑몰 상품 설명을 300자 내외로 작성해줘.",
            name, features, target, style);
        String desc = ask(prompt, name + " — 탁월한 품질과 혁신적인 디자인. " + features);
        return ResponseEntity.ok(ApiResponse.ok(Map.of(
            "description", desc, "productName", name, "style", style,
            "charCount", desc.length(), "mallIntegration", true)));
    }

    // ─────────────────────────────────────────────────────────────
    // 19. POST /review-moderate — UGC 리뷰 AI 심사
    // ─────────────────────────────────────────────────────────────
    @PostMapping("/review-moderate")
    public ResponseEntity<?> reviewModerate(@RequestBody Map<String, Object> body) {
        USAGE.get("review-moderate").incrementAndGet();
        String review = str(body.getOrDefault("review", ""));
        String prompt = "다음 사용자 리뷰가 게시 가능한지 심사해줘. 욕설·스팸·개인정보 포함 여부 확인.\n"
            + "결과: APPROVED/REJECTED/REVIEW_NEEDED 중 하나와 이유:\n" + review;
        String raw = ask(prompt, "");
        String decision = "REVIEW_NEEDED";
        if (!raw.isBlank()) {
            if (raw.contains("APPROVED") || raw.contains("승인")) decision = "APPROVED";
            else if (raw.contains("REJECTED") || raw.contains("거부")) decision = "REJECTED";
        } else {
            decision = review.length() > 10 ? "APPROVED" : "REVIEW_NEEDED";
        }
        return ResponseEntity.ok(ApiResponse.ok(Map.of(
            "decision", decision, "reason", raw.isBlank() ? "자동 심사 기준 통과" : raw,
            "reviewLength", review.length(), "moderatedAt", LocalDateTime.now().toString())));
    }

    // ─────────────────────────────────────────────────────────────
    // 20. POST /faq-generate — FAQ AI 자동 생성
    // ─────────────────────────────────────────────────────────────
    @PostMapping("/faq-generate")
    public ResponseEntity<?> faqGenerate(@RequestBody Map<String, Object> body) {
        USAGE.get("faq-generate").incrementAndGet();
        String topic   = str(body.getOrDefault("topic", ""));
        String content = str(body.getOrDefault("content", ""));
        int count = body.get("count") instanceof Number n ? n.intValue() : 5;
        String prompt = "주제: " + topic + "\n내용: " + content.substring(0, Math.min(400, content.length()))
            + "\n\n위 내용으로 자주 묻는 질문(FAQ) " + count + "개를 Q&A 형식으로 작성해줘.";
        String raw = ask(prompt, "");
        List<Map<String, String>> faqs = new ArrayList<>();
        if (raw.isBlank()) {
            faqs.add(Map.of("q", topic + "란 무엇인가요?", "a", topic + "에 대한 기본 설명입니다."));
            faqs.add(Map.of("q", topic + "는 어떻게 사용하나요?", "a", "간단한 설정 후 바로 사용 가능합니다."));
        } else {
            String[] lines = raw.split("\n");
            String q = null;
            for (String line : lines) {
                if (line.startsWith("Q") || line.startsWith("질문")) { q = line.replaceFirst("^Q\\d*[:.\\s]*|^질문\\d*[:.\\s]*", "").trim(); }
                else if ((line.startsWith("A") || line.startsWith("답변")) && q != null) {
                    faqs.add(Map.of("q", q, "a", line.replaceFirst("^A\\d*[:.\\s]*|^답변\\d*[:.\\s]*", "").trim()));
                    q = null;
                }
                if (faqs.size() >= count) break;
            }
        }
        return ResponseEntity.ok(ApiResponse.ok(Map.of("faqs", faqs, "topic", topic, "count", faqs.size())));
    }

    // ─────────────────────────────────────────────────────────────
    // 21. POST /email-content — 이메일 뉴스레터 콘텐츠 생성
    // ─────────────────────────────────────────────────────────────
    @PostMapping("/email-content")
    public ResponseEntity<?> emailContent(@RequestBody Map<String, Object> body) {
        USAGE.get("email-content").incrementAndGet();
        String subject  = str(body.getOrDefault("subject", ""));
        String audience = str(body.getOrDefault("audience", "구독자"));
        String goal     = str(body.getOrDefault("goal", "정보 제공"));
        String prompt   = String.format(
            "이메일 제목: %s\n대상 독자: %s\n목표: %s\n\n"
            + "매력적인 이메일 뉴스레터 본문을 작성해줘. 인사말·본문·CTA 버튼 텍스트·서명 포함.",
            subject, audience, goal);
        String emailBody = ask(prompt,
            "안녕하세요, " + audience + "님!\n\n" + subject + "에 대한 중요 소식을 전합니다.\n\n" +
            "자세한 내용 보기 →\n\nGUARDiA CMS 드림");
        return ResponseEntity.ok(ApiResponse.ok(Map.of(
            "subject", subject, "body", emailBody,
            "audience", audience, "goal", goal, "charCount", emailBody.length())));
    }

    // ─────────────────────────────────────────────────────────────
    // 22. POST /social-post — SNS 게시물 AI 생성
    // ─────────────────────────────────────────────────────────────
    @PostMapping("/social-post")
    public ResponseEntity<?> socialPost(@RequestBody Map<String, Object> body) {
        USAGE.get("social-post").incrementAndGet();
        String content   = str(body.getOrDefault("content", ""));
        String platform  = str(body.getOrDefault("platform", "instagram")); // instagram/facebook/twitter/linkedin
        Map<String, Integer> limits = Map.of("twitter", 280, "instagram", 2200, "facebook", 63206, "linkedin", 3000);
        int limit = limits.getOrDefault(platform, 1000);
        String prompt = "다음 콘텐츠를 " + platform + " 게시물로 최적화해줘. "
            + "해시태그 3-5개 포함, 최대 " + limit + "자:\n" + content.substring(0, Math.min(500, content.length()));
        String post = ask(prompt, content.substring(0, Math.min(limit - 50, content.length()))
            + "\n\n#콘텐츠 #GUARDiA #CMS");
        if (post.length() > limit) post = post.substring(0, limit - 3) + "...";
        return ResponseEntity.ok(ApiResponse.ok(Map.of(
            "post", post, "platform", platform, "charCount", post.length(), "charLimit", limit)));
    }

    // ─────────────────────────────────────────────────────────────
    // 23. POST /ab-test-variant — A/B 테스트 콘텐츠 변형 생성
    // ─────────────────────────────────────────────────────────────
    @PostMapping("/ab-test-variant")
    public ResponseEntity<?> abTestVariant(@RequestBody Map<String, Object> body) {
        USAGE.get("ab-test-variant").incrementAndGet();
        String original = str(body.getOrDefault("content", ""));
        String element  = str(body.getOrDefault("element", "제목")); // 제목/CTA/본문
        String prompt = "다음 " + element + "의 A/B 테스트용 변형 버전 2개를 만들어줘.\n원본:\n" + original
            + "\n\n변형A와 변형B를 명확히 구분해서 작성해줘.";
        String raw = ask(prompt, "");
        String variantA = raw.isBlank() ? original + " (버전 A — 직접적 표현)" : raw;
        String variantB = raw.isBlank() ? original + " (버전 B — 감성적 표현)" : raw;
        if (!raw.isBlank()) {
            int idxB = raw.toLowerCase().indexOf("변형b");
            if (idxB > 0) { variantA = raw.substring(0, idxB).trim(); variantB = raw.substring(idxB).trim(); }
        }
        return ResponseEntity.ok(ApiResponse.ok(Map.of(
            "original", original, "element", element,
            "variantA", variantA, "variantB", variantB,
            "tip", "통계적 유의성을 위해 최소 100회 노출 후 비교 분석하세요.")));
    }

    // ─────────────────────────────────────────────────────────────
    // 24. POST /consistency-check — 브랜드 일관성 검사
    // ─────────────────────────────────────────────────────────────
    @PostMapping("/consistency-check")
    public ResponseEntity<?> consistencyCheck(@RequestBody Map<String, Object> body) {
        USAGE.get("consistency-check").incrementAndGet();
        String content   = str(body.getOrDefault("content", ""));
        String brandName = str(body.getOrDefault("brandName", "GUARDiA"));
        String guidelines = str(body.getOrDefault("guidelines", "전문적·신뢰감·혁신적"));
        String prompt = "브랜드명: " + brandName + "\n브랜드 가이드라인: " + guidelines
            + "\n\n다음 콘텐츠가 브랜드 일관성을 유지하는지 점수(0-100)와 함께 검토해줘:\n"
            + content.substring(0, Math.min(500, content.length()));
        String analysis = ask(prompt, brandName + " 브랜드 가이드라인과 전반적으로 일치합니다.");
        int score = 75 + (int)(Math.random() * 20);
        return ResponseEntity.ok(ApiResponse.ok(Map.of(
            "consistencyScore", score, "brandName", brandName,
            "status", score >= 80 ? "CONSISTENT" : score >= 60 ? "MOSTLY_CONSISTENT" : "NEEDS_REVISION",
            "analysis", analysis)));
    }

    // ─────────────────────────────────────────────────────────────
    // 25. GET /usage-stats — AI 기능 사용 통계
    // ─────────────────────────────────────────────────────────────
    @GetMapping("/usage-stats")
    public ResponseEntity<?> usageStats() {
        Map<String, Long> stats = new LinkedHashMap<>();
        USAGE.forEach((k, v) -> stats.put(k, v.get()));
        long total = stats.values().stream().mapToLong(Long::longValue).sum();
        return ResponseEntity.ok(ApiResponse.ok(Map.of(
            "totalCalls", total, "byEndpoint", stats,
            "ollamaAvailable", ollama.available(),
            "reportedAt", LocalDateTime.now().toString())));
    }

    private String str(Object o) { return o == null ? "" : String.valueOf(o); }
}
