// ai-opinions.jsx — AI 의견(매수 신호) 유형 전수 유형화 + 직관적 컬러 시스템
// API가 내려주는 signal 코드(BUY/ACC/WATCH/HOLD/AVOID)를 단일 소스로 통합.
// 컬러 규칙: 매수=초록/블루, 관망·보유=옐로/오렌지, 회피=레드.

const AI_OPINIONS = Object.freeze({
  BUY:   Object.freeze({ code: 'BUY',   label: '강력매수', group: 'buy',   color: '#1FB57A', bg: 'rgba(31,181,122,0.14)', desc: '종합점수 84+ · 적극 매수 구간',      scoreMin: 84, order: 1 }),
  ACC:   Object.freeze({ code: 'ACC',   label: '매수',     group: 'buy',   color: '#2D7FF9', bg: 'rgba(45,127,249,0.14)', desc: '종합점수 76+ · 매수 우위',         scoreMin: 76, order: 2 }),
  WATCH: Object.freeze({ code: 'WATCH', label: '관망',     group: 'watch', color: '#F5851F', bg: 'rgba(245,133,31,0.14)', desc: '종합점수 64+ · 추세 확인 후 진입',   scoreMin: 64, order: 3 }),
  HOLD:  Object.freeze({ code: 'HOLD',  label: '보유',     group: 'watch', color: '#FFB020', bg: 'rgba(255,176,32,0.14)', desc: '종합점수 55+ · 신규 매수보다 보유', scoreMin: 55, order: 4 }),
  AVOID: Object.freeze({ code: 'AVOID', label: '회피',     group: 'avoid', color: '#E64545', bg: 'rgba(230,69,69,0.14)', desc: '하락 위험 · 신규 진입 비권장',     scoreMin: 0,  order: 5 }),
});

const AI_OPINION_CODES = Object.freeze(Object.keys(AI_OPINIONS));                          // ['BUY','ACC','WATCH','HOLD','AVOID']
const AI_OPINION_LIST = Object.freeze(AI_OPINION_CODES.map(c => AI_OPINIONS[c]).sort((a, b) => a.order - b.order));
const AI_OPINION_LABEL_TO_CODE = Object.freeze(AI_OPINION_CODES.reduce((m, c) => { m[AI_OPINIONS[c].label] = c; return m; }, {}));

function opinionOf(code) { return AI_OPINIONS[code] || AI_OPINIONS.WATCH; }
function opinionColor(code) { return opinionOf(code).color; }
function opinionLabel(code) { return opinionOf(code).label; }
function codeFromLabel(label) { return AI_OPINION_LABEL_TO_CODE[label] || (AI_OPINIONS[label] ? label : null); }

Object.assign(window, {
  AI_OPINIONS, AI_OPINION_CODES, AI_OPINION_LIST, AI_OPINION_LABEL_TO_CODE,
  opinionOf, opinionColor, opinionLabel, codeFromLabel,
});
