package com.zioinfo.hrm.ai;

import com.zioinfo.hrm.ai.service.AiTextRouter;
import com.zioinfo.hrm.common.ai.TextAiClient.GenResult;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;

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

/**
 * AI 인사 분석 서비스. 텍스트 생성은 {@link AiTextRouter} 경유(provider 선택: Claude ↔ Ollama).
 * 외부 AI API 는 소유자 승인 예외인 Claude(api.anthropic.com) 만 허용, 그 외 온프레미스 Ollama 전용.
 * Claude/Ollama 응답 실패 시 Java 폴백 로직으로 대체(무회귀).
 */
@Slf4j
@Service
@RequiredArgsConstructor
public class AiService {

    /** provider 라우터(Claude→Ollama 폴백 + 추론 로그). 기존 Ollama 직접호출을 대체. */
    private final AiTextRouter aiTextRouter;

    public Map<String, Object> predictTurnover(Long empId) {
        try {
            String prompt = String.format(
                "HRM AI: 사원 ID %d의 이직 위험도를 분석하라. " +
                "근속연수, 성과등급, 급여 대비 시장가 등을 고려하여 JSON으로 응답: " +
                "{\"risk\":\"HIGH/MEDIUM/LOW\",\"score\":0-100,\"reasons\":[],\"recommendations\":[]}", empId);
            return callOllama(prompt);
        } catch (Exception e) {
            log.warn("Ollama 이직예측 폴백: {}", e.getMessage());
            return fallbackTurnover();
        }
    }

    public Map<String, Object> predictPerformance(Long empId) {
        try {
            String prompt = String.format(
                "HRM AI: 사원 ID %d의 다음 분기 성과를 예측하라. " +
                "과거 성과, 교육 이수, 목표 달성률을 기반으로 JSON: " +
                "{\"predictedGrade\":\"S/A/B/C\",\"score\":0-100,\"keyFactors\":[]}", empId);
            return callOllama(prompt);
        } catch (Exception e) {
            log.warn("Ollama 성과예측 폴백");
            return Map.of("predictedGrade", "B", "score", 75, "keyFactors", List.of("데이터 수집 중"));
        }
    }

    public Map<String, Object> recommendRecruitment(Map<String, Object> criteria) {
        try {
            String prompt = "HRM AI: 채용 요건 " + criteria + " 에 최적화된 채용 전략을 JSON으로 추천하라. " +
                "{\"channels\":[],\"keywords\":[],\"salaryRange\":{},\"timeline\":\"\"}";
            return callOllama(prompt);
        } catch (Exception e) {
            log.warn("Ollama 채용추천 폴백");
            return Map.of("channels", List.of("잡코리아", "사람인", "링크드인"),
                "keywords", List.of("경력3년", "Spring Boot"),
                "salaryRange", Map.of("min", 4000, "max", 6000, "unit", "만원"),
                "timeline", "4주");
        }
    }

    public Map<String, Object> analyzeOrgHealth(Long deptId) {
        try {
            String prompt = deptId != null
                ? "HRM AI: 부서 ID " + deptId + "의 조직 건강도를 분석하라."
                : "HRM AI: 전사 조직 건강도를 분석하라.";
            prompt += " JSON: {\"healthScore\":0-100,\"strengths\":[],\"risks\":[],\"actions\":[]}";
            return callOllama(prompt);
        } catch (Exception e) {
            log.warn("Ollama 조직건강 폴백");
            return Map.of("healthScore", 78, "strengths", List.of("팀워크", "기술력"),
                "risks", List.of("이직률 증가"), "actions", List.of("보상 체계 개선"));
        }
    }

    public Map<String, Object> analyzeResume(Map<String, Object> resume) {
        try {
            String prompt = "HRM AI: 다음 이력서를 분석하여 적합성을 평가하라: " + resume +
                " JSON: {\"score\":0-100,\"strengths\":[],\"concerns\":[],\"recommendation\":\"\"}";
            return callOllama(prompt);
        } catch (Exception e) {
            log.warn("Ollama 이력서분석 폴백");
            return Map.of("score", 70, "strengths", List.of("경험 보유"),
                "concerns", List.of("추가 검토 필요"), "recommendation", "면접 진행 권장");
        }
    }

    public Map<String, Object> getHrInsights() {
        try {
            String prompt = "HRM AI: 현재 인사 데이터 기반으로 주요 인사이트를 3가지 제공하라. " +
                "JSON: {\"insights\":[{\"title\":\"\",\"desc\":\"\",\"priority\":\"HIGH/MEDIUM/LOW\"}]}";
            return callOllama(prompt);
        } catch (Exception e) {
            log.warn("Ollama HR인사이트 폴백");
            Map<String, Object> r = new HashMap<>();
            r.put("insights", List.of(
                Map.of("title", "이직 위험군 모니터링", "desc", "3개월 이내 이직 위험 사원 5명 식별", "priority", "HIGH"),
                Map.of("title", "교육 이수율 개선", "desc", "법정교육 미이수자 12명 알림 발송 권장", "priority", "MEDIUM"),
                Map.of("title", "성과 평가 진행률", "desc", "2분기 평가 완료율 65%, 조속한 완료 필요", "priority", "MEDIUM")
            ));
            return r;
        }
    }

    private Map<String, Object> callOllama(String prompt) {
        // provider 라우터 경유: provider=claude·키설정·활성 → Claude, 실패/그외 → Ollama(선택모델) 폴백.
        GenResult gr = aiTextRouter.generate(prompt);
        if (gr.degraded() || gr.text() == null || gr.text().isBlank()) {
            return fallbackTurnover();
        }
        String response = gr.text();
        // JSON 추출
        int start = response.indexOf('{');
        int end = response.lastIndexOf('}');
        if (start >= 0 && end > start) {
            // 간단 파싱: 실제로는 Jackson 사용
            Map<String, Object> r = new HashMap<>();
            r.put("raw", response.substring(start, end + 1));
            r.put("source", "ai");
            return r;
        }
        return Map.of("response", response, "source", "ai");
    }

    private Map<String, Object> fallbackTurnover() {
        return Map.of("risk", "MEDIUM", "score", 50,
            "reasons", List.of("Ollama 오프라인 — 데이터 수집 후 재분석 필요"),
            "recommendations", List.of("정기 면담 진행"));
    }
}
