// tradingData.jsx — 트레이딩 데스크 현업 요구 반영 데이터.
// 수급 상위 · 시장경보 · 지분공시 · 딜러 한도(SA/투자/손절매/비율) · KOSPI 델타.

// ---- 베타·변동성 산출 기간 프리셋 ----
const BETA_PERIODS = ['1M', '3M', '6M', '1Y'];
const PERIOD_ADJ = { '1M': { v: 1.18, b: 1.06 }, '3M': { v: 1.00, b: 1.00 }, '6M': { v: 0.91, b: 0.97 }, '1Y': { v: 0.85, b: 0.94 } };

// ---- 종목 메타 — 베타(3M 기준)·연변동성·거래소 시장경보 ----
const EQ_META = {
  '005930': { beta: 1.12, vol: 21, alert: null },
  '373220': { beta: 1.35, vol: 36, alert: '투자주의' },
  '207940': { beta: 0.88, vol: 27, alert: null },
  '000270': { beta: 1.04, vol: 23, alert: null },
  '035420': { beta: 1.18, vol: 30, alert: null },
  '035720': { beta: 1.22, vol: 34, alert: '투자경고' },
  '005490': { beta: 1.24, vol: 32, alert: null },
  '105560': { beta: 0.94, vol: 19, alert: null },
  '055550': { beta: 0.92, vol: 18, alert: null },
  '006400': { beta: 1.28, vol: 33, alert: '투자주의' },
  '068270': { beta: 0.96, vol: 29, alert: null },
  '012330': { beta: 1.02, vol: 22, alert: null }
};
function eqMeta(t) { return EQ_META[t] || { beta: 1.0, vol: 25, alert: null }; }
function eqBeta(t, period = '3M') { return +(eqMeta(t).beta * PERIOD_ADJ[period].b).toFixed(2); }
function eqVol(t, period = '3M') { return +(eqMeta(t).vol * PERIOD_ADJ[period].v).toFixed(1); }
// 시장경보 → pill kind (매수 시 위탁증거금 예탁 필요)
const MKT_ALERT_KIND = { '투자주의': 'warn', '투자경고': 'alert', '투자위험': 'alert' };

// ---- 수급 동향 — 주체별 순매수 상위 Top 5 (5영업일 누적, 억원) ----
const FLOW_TOP = {
  '외국인': [
    { ticker: '000660', name: 'SK하이닉스', sector: '반도체', amt: 8420 },
    { ticker: '005930', name: '삼성전자', sector: '반도체', amt: 6210 },
    { ticker: '005380', name: '현대차', sector: '자동차', amt: 3840 },
    { ticker: '105560', name: 'KB금융', sector: '금융', amt: 2130 },
    { ticker: '267260', name: 'HD현대일렉트릭', sector: '전력기기', amt: 1660 }],
  '연기금': [
    { ticker: '005930', name: '삼성전자', sector: '반도체', amt: 2840 },
    { ticker: '068270', name: '셀트리온', sector: '바이오', amt: 1120 },
    { ticker: '000270', name: '기아', sector: '자동차', amt: 980 },
    { ticker: '005490', name: 'POSCO홀딩스', sector: '소재', amt: 860 },
    { ticker: '035420', name: 'NAVER', sector: '인터넷', amt: 740 }],
  '기관': [
    { ticker: '000660', name: 'SK하이닉스', sector: '반도체', amt: 4210 },
    { ticker: '010120', name: 'LS ELECTRIC', sector: '전력기기', amt: 1830 },
    { ticker: '005380', name: '현대차', sector: '자동차', amt: 1540 },
    { ticker: '055550', name: '신한지주', sector: '금융', amt: 1210 },
    { ticker: '207940', name: '삼성바이오로직스', sector: '바이오', amt: 990 }]
};

// ---- 지분공시 모니터링 — IBK 그룹 합산 지분율 (지분투자 + 트레이딩 보유) ----
// 5% 이상 보유 종목은 1%p 변동 시 '주식등의 대량보유상황 보고'(5%룰) 대상.
const STAKE_WATCH = [
  { ticker: '010120', name: 'LS ELECTRIC', holder: '지분투자 + 자기매매', stake: 7.85, last: 7.12, rule: '5%룰 · 1%p 변동 보고', room: 0.27, status: '공시 임박' },
  { ticker: '068270', name: '셀트리온', holder: '지분투자 + 트레이딩', stake: 6.31, last: 5.84, rule: '5%룰 · 1%p 변동 보고', room: 0.53, status: '주의' },
  { ticker: '035720', name: '카카오', holder: '트레이딩 + 신탁', stake: 5.08, last: 5.02, rule: '5%룰 · 1%p 변동 보고', room: 0.94, status: '여유' },
  { ticker: '012330', name: '현대모비스', holder: '지분투자', stake: 5.44, last: 5.31, rule: '5%룰 · 1%p 변동 보고', room: 0.87, status: '여유' },
  { ticker: '006400', name: '삼성SDI', holder: '트레이딩', stake: 4.62, last: null, rule: '5% 신규 보고 대상 접근', room: 0.38, status: '주의' }];
const STAKE_KIND = { '공시 임박': 'alert', '주의': 'warn', '여유': 'ok' };

// ---- 손절매한도 — 종목 단위 손절 구간 (매입가 대비 등락률, -5/-10/-15/-20%) ----
// 손절매는 종목 단위 의사결정: 각 보유 종목이 어느 구간에 도달했는지를 표시한다.
const STOP_LADDER = [-5, -10, -15, -20];
const STOP_ZONES = [
{ v: 0, l: '정상', kind: 'ok' },
{ v: 1, l: '-5%', kind: 'warn' },
{ v: 2, l: '-10%', kind: 'warn' },
{ v: 3, l: '-15%', kind: 'alert' },
{ v: 4, l: '-20%', kind: 'alert' }];
function stopZoneOf(ret) { return ret <= -20 ? 4 : ret <= -15 ? 3 : ret <= -10 ? 2 : ret <= -5 ? 1 : 0; }
// 포트폴리오 내 구간별 도달 종목 수 [정상, -5, -10, -15, -20]
function stopCounts(pf) { const c = [0, 0, 0, 0, 0]; pf.holds.forEach((h) => { const u = UMAP[h.id]; if (u) c[stopZoneOf(u.ret)]++; }); return c; }
// 종목별 손절 구간 셀 — 4구간 미니 래더 + 현재 구간 라벨
function StopZoneCell({ ret }) {
  const z = stopZoneOf(ret);
  const zone = STOP_ZONES[z];
  return (
    <span title={`매입가 대비 ${ret > 0 ? '+' : ''}${ret.toFixed(1)}%`} style={{ display: 'inline-flex', alignItems: 'center', gap: 8, justifyContent: 'flex-end' }}>
      <span style={{ display: 'inline-flex', gap: 2 }}>
        {[1, 2, 3, 4].map((i) => <span key={i} style={{ width: 13, height: 7, borderRadius: 2, background: i <= z ? i >= 3 ? T.alert : T.warn : T.c150 }} />)}
      </span>
      <b className="num" style={{ width: 38, textAlign: 'right', color: z === 0 ? T.c400 : STATUS[zone.kind].fg, fontSize: 12.5 }}>{zone.l}</b>
    </span>);
}

// ---- 딜러 한도 — SA(표준방법) 한도 · 투자한도 · 비율 한도 ----
// 한도 설정 권한: 리스크총괄부 / 조회·활용: 트레이딩 부서.
// sa: 표준방법(Standardized Approach)으로 산출한 시장리스크 한도 [현재값, 배정 한도] (억).
// invest: 배정 투자가능금액 대비 현재 집행액 [집행, 배정] (억).
// ratio: 단일 종목 집중도 한도 — 시가총액 비중 cap(%) vs 현재 최대 max(%).
const DEALER_LIMITS = {
  '20180417': { sa: [128, 160], invest: [3240, 3600], ratio: { cap: 3.0, max: 1.86, n: 'SK하이닉스' } },   // 62% 정상
  '20191103': { sa: [96, 120], invest: [2620, 3000], ratio: { cap: 2.5, max: 2.13, n: '셀트리온' } },      // 85% 주의
  '20200622': { sa: [118, 130], invest: [2980, 3200], ratio: { cap: 2.0, max: 2.18, n: 'LS ELECTRIC' } }, // 109% 초과
  '20190718': { sa: [102, 140], invest: [3270, 3800], ratio: null },  // 비율한도 미적용
  '20170815': { sa: [92, 110], invest: [6130, 7000], ratio: null },
  '20210309': { sa: [88, 120], invest: [7480, 8000], ratio: null },
  '20160527': { sa: [121, 150], invest: [8920, 9500], ratio: null },
  '20151001': { sa: [84, 102], invest: [5560, 6000], ratio: null },
  '20220214': { sa: [47, 58], invest: [2980, 3100], ratio: null }
};
function dealerLimit(emp) { return DEALER_LIMITS[emp] || null; }
function limUtil(pair) { return pair[0] / pair[1] * 100; }
function utilColor(pct) { return pct >= 100 ? T.alert : pct >= 80 ? T.warn : T.c900; }

// ---- KOSPI 기준 델타 — 보유주식 베타 가중 노출 (억원) ----
// KOSPI 1% 변동 시 평가손익 ≈ 델타 × 1%.
function kospiDelta(pf, period = '3M') {
  return pf.holds.reduce((s, h) => {
    const u = UMAP[h.id]; if (!u || u.type !== '주식') return s;
    return s + pf.value * h.w / 100 * (u.beta || 1) * PERIOD_ADJ[period].b;
  }, 0);
}

Object.assign(window, {
  BETA_PERIODS, PERIOD_ADJ, EQ_META, eqMeta, eqBeta, eqVol, MKT_ALERT_KIND,
  FLOW_TOP, STAKE_WATCH, STAKE_KIND, STOP_LADDER, STOP_ZONES, stopZoneOf, stopCounts, StopZoneCell, DEALER_LIMITS, dealerLimit, limUtil, utilColor, kospiDelta
});
