import { AIService } from '../../core/services';
import { logError, logInfo } from '../../utils';
import { readStocksStore, updateStock } from './stocksStore';
import type { Stock } from './types';

/**
 * `/stocks judge <심볼>` 의 코어 — 종목의 재무 데이터를 LLM 에게 던져
 * "3/4 필터" 4-criteria (ROE / 성장성 / 유동성 / 수익성) 평가를 받고
 * stocks.json 의 `"3/4 필터"` 필드를 업데이트.
 *
 * LLM 신뢰도 이슈는 사용자가 인지한 trade-off — 자동화 결과를 *제안* 으로 보고
 * 결과 텍스트에 "자동 평가" prefix 를 박아 수동 판정과 구분 가능하게.
 *
 * 출력 형식 (LLM 에게 강제):
 *   첫 줄: "충족 (ROE, 성장성, 유동성)" 또는 "미충족"
 *   둘째 줄 ~ : (선택) 이유 한두 줄 — 호출자가 webview 에 같이 보여줌
 *
 * `.includes("충족")` 매칭은 unchanged → signalClassifier 가 자동으로 인식.
 */

export interface JudgeResult {
    ok: boolean;
    /** stocks.json 에 저장된 새 "3/4 필터" 텍스트. */
    filterText?: string;
    /** LLM 이 제시한 평가 근거 (사용자에게 보여줌). */
    rationale?: string;
    error?: string;
}

const SYSTEM_PROMPT = [
    '당신은 한국 주식 가치 평가 보조 도구다. 사용자가 제공한 종목의 *재무 지표만* 보고',
    '필터 평가를 내린다. 외부 정보 추측 금지 — 주어진 숫자에서만 판단.',
    '',
    '**사용 가능한 8개 평가 키워드** (사용자의 실제 분류 패턴):',
    '  - ROE: ROE(25E) ≥ 10% 이면 통과. 15% 이상은 우수 (통과 강하게).',
    '  - 성장성: 영업이익률(25E) ≥ 15% 또는 상장일이 3년 이내 신규성장주.',
    '  - 유동성: 유보율 ≥ 1,000% 이면 통과 (자기자본 충분).',
    '  - 수익성: 영업이익률(25E) ≥ 10% 이면 통과. 20% 이상이면 "수익성 개선" 표기 가능.',
    '  - 영업효율: 영업이익률(25E) ≥ 15% + ROE ≥ 8% 동시 만족 (효율성 시그널).',
    '  - 기술력: "최대 먹거리" 가 AI / 반도체 / 배터리 / 바이오 / 기술 영역이고 PBR ≥ 2 (시장이 기술 premium 인정).',
    '  - 안정성: 유보율 ≥ 3,000% + 시가총액 ≥ 5,000억 (대형주 안전).',
    '  - PBR: PBR ≤ 1.5 이면 통과 (저평가 시그널, 저평가우량주에서 주로 사용).',
    '',
    '**투자성향별 우선 적용 키워드:**',
    '  - 스윙/중기: ROE / 성장성 / 유동성 / 수익성 위주.',
    '  - 장기투자: 성장성 / 유동성 / 기술력 / 영업효율 위주.',
    '  - 저평가우량주: PBR / ROE 필수 + (성장성 또는 수익성 또는 안정성) 중 1개.',
    '',
    '**판정 규칙:**',
    '  - 위 8개 키워드 중 *3개 이상* 통과 → "충족 (통과한 항목들 콤마 구분)" 형식.',
    '    예: "충족 (ROE, 성장성, 유동성)" / "충족 (PBR, ROE, 안정성)" / "충족 (성장성, 유동성, 수익성 개선)"',
    '  - 3개 미만 → "미충족 (사유: 핵심 약점 한 줄)"',
    '',
    '**키워드 선택 가이드:**',
    '  - 한 종목에서 통과한 키워드 *모두* 나열하지 말고 *그 종목 성격을 가장 잘 보여주는 3개* 만 선택.',
    '  - 투자성향별 우선 키워드를 먼저 포함시키고, 빠진 부분은 다른 키워드로 메움.',
    '',
    '**실제 패턴 예시** (학습용 — 사용자가 이미 분류한 종목들):',
    '  - 마녀공장 (ROE 15.6%, 영업이익률 18.0%, 유보율 5,800%, 스윙/중기) → "충족 (ROE, 성장성, 유동성)"',
    '  - 기가비스 (ROE 7.23%, 영업이익률 25.7%, 유보율 4,250%, 신규 상장 2년차, 스윙/중기) → "충족 (성장성, 유동성, 수익성 개선)" (ROE 가 10% 미만이라 빠짐, 대신 수익성 강함)',
    '  - 엔켐 (ROE 12.4%, 영업이익률 8.5%, 유보율 1,250%, 스윙/중기) → "충족 (성장성, 유동성)" (영업이익률이 10% 미만이라 수익성 빠짐)',
    '',
    '**출력 형식 (반드시 이대로):**',
    '  1번째 줄: 위 형식의 판정 문구만 (다른 텍스트 절대 금지)',
    '  2번째 줄: 빈 줄',
    '  3번째 줄 이후: 평가 근거 2-3 문장 — 어떤 지표가 어떤 threshold 를 통과/미통과했는지 *구체 수치 인용*.',
].join('\n');

function buildUserPrompt(s: Stock): string {
    const lines = [
        `종목: ${s.이름} (${s.심볼})`,
        `상장일: ${s.상장일 ?? '미상'}`,
        `투자성향: ${s.투자성향 ?? '미분류'}`,
        `유보율: ${s.유보율 ?? '-'}`,
        `ROE(25E): ${s['ROE(25E)'] ?? '-'}`,
        `영업이익률(25E): ${s['영업이익률(25E)'] ?? '-'}`,
        `EPS(25E): ${s['EPS(25E)'] ?? '-'}`,
        `PER(25E): ${s['PER(25E)'] ?? '-'}`,
        `PBR: ${s.PBR ?? '-'}`,
        `시가총액: ${s.시가총액 ?? '-'}`,
        `최대 먹거리: ${s['최대 먹거리'] ?? '-'}`,
        `특이사항: ${s.특이사항 ?? '-'}`,
        '',
        '위 데이터로 4-criteria 필터 판정.',
    ];
    return lines.join('\n');
}

export async function judgeStock(symbol: string): Promise<JudgeResult> {
    const store = readStocksStore();
    const stock = store.find(s => s.심볼 === symbol);
    if (!stock) {
        return { ok: false, error: `심볼 ${symbol} 을 stocks.json 에서 못 찾음` };
    }

    const ai = new AIService();
    try {
        const result = await ai.chat({
            system: SYSTEM_PROMPT,
            user: buildUserPrompt(stock),
        });
        if (result.empty || !result.content.trim()) {
            return { ok: false, error: 'LLM 이 빈 응답 반환' };
        }
        const lines = result.content.split('\n');
        const firstLine = (lines[0] || '').trim();
        const rationale = lines.slice(2).join('\n').trim() || undefined;

        if (!firstLine) return { ok: false, error: 'LLM 응답 형식 오류 (첫 줄 비어있음)' };

        // 텍스트 형식 검증 — "충족" 또는 "미충족" 으로 시작해야 signalClassifier 가 인식.
        if (!/^(충족|미충족)/.test(firstLine)) {
            return { ok: false, error: `LLM 응답 형식 오류 (충족/미충족 prefix 없음): ${firstLine.slice(0, 80)}` };
        }

        // "자동 평가" prefix 박아서 수동/자동 구분 가능하게.
        const filterText = `[자동 평가] ${firstLine}`;
        const wrote = updateStock(symbol, { '3/4 필터': filterText });
        if (!wrote) return { ok: false, error: 'stocks.json 쓰기 실패' };

        logInfo('Stocks LLM judge 완료.', { symbol, filterText, model: result.model });
        return { ok: true, filterText, rationale };
    } catch (e: any) {
        logError('Stocks LLM judge 실패.', { symbol, error: e?.message ?? String(e) });
        return { ok: false, error: e?.message ?? String(e) };
    }
}
