import type { Stock, ClassifiedStock, Signal } from './types';

/**
 * invest_results/gs_update_api.js 의 분류 로직 포팅.
 *
 *   1. filterPass = "3/4 필터" 에 "충족" 포함 여부 (정성 필터, 사용자가 사전 평가)
 *   2. isPriceInZone = 현재가 > 0 && 매수권장가 > 0 && 현재가 <= 매수권장가
 *   3. signal:
 *        - filterPass + priceInZone → BUY_ZONE (sortScore 2, "🚨 매수사정권!")
 *        - filterPass + !priceInZone → OVERVALUED (sortScore 1, "⚠️ 고평가! 가격 조정 감시 중")
 *        - !filterPass → HOLD (sortScore 0, "관망")
 *
 * 텍스트 문구는 사용자 익숙한 텍스트 그대로 유지 (텔레그램 보고서/Sheets 양쪽에 동일하게 보임).
 */

const SIGNAL_TEXT: Record<Signal, string> = {
    BUY_ZONE: '🚨 매수사정권! (바닥 안착 시 매수 개시)',
    OVERVALUED: '⚠️ 고평가! 가격 조정 감시 중',
    HOLD: '관망',
};

/** "23,760" 같은 콤마 포함 텍스트 → number. 빈 문자열 / 파싱 실패 시 0. */
function parsePrice(raw: string | number | undefined): number {
    if (typeof raw === 'number') return Number.isFinite(raw) ? raw : 0;
    if (!raw) return 0;
    const cleaned = String(raw).replace(/,/g, '').trim();
    const n = parseFloat(cleaned);
    return Number.isFinite(n) ? n : 0;
}

export function classifyStock(s: Stock): ClassifiedStock {
    const curPrice = parsePrice(s.현재가);
    const recPrice = parsePrice(s.매수권장가);
    const isPriceInZone = curPrice > 0 && recPrice > 0 && curPrice <= recPrice;
    const filterPass = (s['3/4 필터'] || '').toString().includes('충족');

    let signal: Signal = 'HOLD';
    let sortScore: 0 | 1 | 2 = 0;
    if (filterPass) {
        if (isPriceInZone) { signal = 'BUY_ZONE'; sortScore = 2; }
        else { signal = 'OVERVALUED'; sortScore = 1; }
    }

    return {
        ...s,
        signal,
        sortScore,
        filterPass,
        signalText: SIGNAL_TEXT[signal],
    };
}

/** 전체 분류 + 투자성향별 정렬. 텔레그램 / 시트 동기화 둘 다 이걸 호출. */
export function classifyAll(stocks: Stock[]): {
    swing: ClassifiedStock[];
    long: ClassifiedStock[];
    ultraLow: ClassifiedStock[];
    all: ClassifiedStock[];
} {
    const classified = stocks.map(classifyStock);
    const filterByProfile = (profile: Stock['투자성향']) =>
        classified.filter(s => s.투자성향 === profile).sort((a, b) => b.sortScore - a.sortScore);
    return {
        swing: filterByProfile('스윙/중기'),
        long: filterByProfile('장기투자'),
        ultraLow: filterByProfile('저평가우량주'),
        all: classified.slice().sort((a, b) => b.sortScore - a.sortScore),
    };
}
