/* trust-architecture.jsx — 하이브리드 인텔리전스 신뢰 레이어 (Supermetrics 관점 반영)
 *
 *  핵심 원칙(매트릭스 제안에 명시):
 *   1) 결정론적 가드레일 — 모든 수치(도달·CTR·CVR·CPM·ROAS·예측매출·입찰한도)는
 *      코드가 계산한다. LLM은 계산하지 않는다(텍스트 예측 ≠ 산술). → 재현성 보장.
 *   2) 딥 도메인 지식 — 벤치마크·규칙·tier prior + "인과 경로"(왜 이 제안인가)를 노출.
 *   3) 확률적 추론 — 의도 해석·서술형 평가만 LLM/휴리스틱(비결정·참고)으로 라벨.
 *
 *  연산 출처(layer)는 데이터 신뢰도(tier A/B/C)와 직교하는 축이다.
 */
(function () {
  /* 연산 출처(provenance)는 canonical 3값으로 표준화한다:
   *   'deterministic' | 'domain_rule' | 'llm'
   * 뱃지 종류는 이 필드를 '읽어서' 결정한다 — 컴포넌트 내부에 뱃지 종류를 하드코딩하지 않는다.
   */
  var LAYER = {
    deterministic: { label: '결정론 · 코드 계산', short: '코드', color: '#5fcf94', bg: '#13301f',
      note: '내부 계산 로직이 산출 — 같은 입력이면 항상 같은 값(재현 가능). LLM 미개입.' },
    domain_rule: { label: '도메인 지식 · 규칙/벤치마크', short: '지식', color: '#5fc7e0', bg: '#11303a',
      note: '벤치마크·규칙·카테고리 참고치 기반. 인과 경로를 따라 도출.' },
    llm: { label: '확률 · LLM 해석', short: '해석', color: '#b79ae0', bg: '#2a233a',
      note: 'LLM/휴리스틱 서술·의도 추론. 비결정 — 참고용·스폿체크 대상, 검증된 수치 아님.' },
  };
  /* 레거시/구어 출처값 → canonical 매핑 (하위호환) */
  var ALIAS = {
    knowledge: 'domain_rule', probabilistic: 'llm',
    code: 'deterministic', deterministic: 'deterministic',
    rule: 'domain_rule', benchmark: 'domain_rule',
    heuristic: 'llm', narrative: 'llm', model: 'llm',
  };
  function resolveProv(p) {
    if (p && LAYER[p]) return p;       // 이미 canonical
    if (p && ALIAS[p]) return ALIAS[p]; // 레거시 별칭
    return null;                        // 미지정/미인식
  }

  /* 지표별 연산 출처(prov) + 인과 경로 — 실제 엔진 공식을 직접 감사해 분류(추정 금지).
   *   deterministic : 코드(sim-engine evalQuery / PredictiveCurve / BidGuide)가 산출
   *   domain_rule   : 벤치마크·규칙·tier prior 기반
   *   llm           : 모델/휴리스틱 서술 (수치 산출 아님)
   * 감사 근거:
   *   fitness  → sim-engine.js fitnessParts (성별·연령·시간·디바이스·지면·구매의도 가중합)
   *   roas/revenue → sim-engine.js PredictiveCurve 루프 (revenue=clicks×cvr×AOV, roas=revenue/cpm)
   *   becpc/cpccap → workflow.jsx BidGuide (beCpc=AOV×CVR, cpc300=beCpc/목표ROAS)
   *   reach/ctr/cvr/cpm → sim-engine.js evalQuery 카테고리 베이스 × 결정론 보정
   *   priors/benchmark → 규칙·표본 prior
   *   narrative → generateNarrative/summarize (서술 프레이밍 — llm로 보수 분류)
   */
  var METRIC = {
    reach:    { prov: 'deterministic', label: '예상 도달', path: ['카테고리 reachIdx', '인구통계 필터', '지면 보정'] },
    ctr:      { prov: 'deterministic', label: 'CTR', path: ['카테고리 ctr 베이스', '디바이스·지면 보정'] },
    cvr:      { prov: 'deterministic', label: 'CVR', path: ['카테고리 cvr 베이스', '구매의도 단계 보정'] },
    cpm:      { prov: 'deterministic', label: 'CPM', path: ['카테고리 cpm', '경쟁·지면 보정'] },
    roas:     { prov: 'deterministic', label: 'ROAS', path: ['예측매출', '÷ 광고비(CPM×노출)'] },
    revenue:  { prov: 'deterministic', label: '예측 매출', path: ['도달', '× CTR', '× CVR', '× 객단가(AOV)'] },
    becpc:    { prov: 'deterministic', label: '손익분기 CPC', path: ['객단가(AOV)', '× CVR'] },
    cpccap:   { prov: 'deterministic', label: '유효 CPC 한도', path: ['객단가', '× CVR', '÷ 목표 ROAS'] },
    fitness:  { prov: 'deterministic', label: '전환 적합도', path: ['성별', '연령', '시간', '디바이스', '지면', '구매의도'] },
    priors:   { prov: 'domain_rule', label: '카테고리 prior', path: ['표본 n', 'pooled 평균·분산', 'tier 가중'] },
    benchmark:{ prov: 'domain_rule', label: '벤치마크', path: ['업종 표준', '나스 인사이트', '데이터랩'] },
    narrative:{ prov: 'llm', label: '서술형 평가', path: ['지표 종합', 'LLM/휴리스틱 해석'] },
  };

  function Badge(props) {
    /* provenance 필드를 읽어 뱃지를 결정. 미지정/미인식이면 보수적으로 llm(올려치기 금지).
     * 절대 deterministic으로 기본 처리하지 않는다 — 증명 못 하는 수치에 '결정론' 보증을 달면 거짓 보증. */
    var raw = props.provenance != null ? props.provenance : props.layer;
    var key = resolveProv(raw);
    if (!key) {
      if (raw != null && typeof console !== 'undefined' && console.warn)
        console.warn('[TrustBadge] 미인식 provenance "' + raw + '" → 보수적으로 llm 처리(요확인).');
      key = 'llm';
    }
    var L = LAYER[key];
    return React.createElement('span', {
      title: L.note,
      style: { display: 'inline-flex', alignItems: 'center', gap: 4, padding: '1px 7px', borderRadius: 4,
        fontSize: 10, fontFamily: 'var(--font-mono, monospace)', fontWeight: 600, background: L.bg, color: L.color,
        whiteSpace: 'nowrap', cursor: 'help', verticalAlign: 'middle' }
    }, (props.dot !== false ? '◆ ' : '') + (props.full ? L.label : L.short));
  }

  /* 인과 경로 칩 — A ← B ← C (knowledge-graph 미니뷰) */
  function CausalPath(props) {
    var m = METRIC[props.metric]; if (!m) return null;
    var items = props.items || m.path;
    /* 메트릭의 provenance 필드(prov)를 그대로 Badge에 넘겨 뱃지 결정 — 하드코딩 없이 필드 참조. */
    return React.createElement('div', { style: { display: 'flex', alignItems: 'center', gap: 6, flexWrap: 'wrap', margin: props.compact ? 0 : '6px 0 2px' } },
      React.createElement('span', { style: { fontSize: 11.5, fontWeight: 700, color: 'var(--ink-100, #e8e8ea)' } }, m.label),
      (props.badge !== false ? React.createElement(Badge, { provenance: m.prov }) : null),
      items.map(function (it, i) {
        return React.createElement(React.Fragment, { key: i },
          React.createElement('span', { style: { color: 'var(--ink-400, #7a8088)', fontSize: 11 } }, '←'),
          React.createElement('span', { style: { fontSize: 10.5, fontFamily: 'var(--font-mono, monospace)', color: 'var(--ink-300, #a8aeb6)',
            background: 'var(--surface, #1a1d23)', border: '1px solid var(--border, #2a2e36)', borderRadius: 4, padding: '1px 6px' } }, it)
        );
      })
    );
  }

  /* 신뢰 원칙 패널 — 제안 상단에 1회 노출 */
  function TrustPrinciple(props) {
    var compact = props.compact;
    return React.createElement('div', {
      style: { border: '1px solid var(--border, #2a2e36)', borderRadius: 9, padding: compact ? '11px 13px' : '14px 16px',
        background: 'var(--surface, #1a1d23)' }
    },
      React.createElement('div', { style: { display: 'flex', alignItems: 'center', gap: 8, flexWrap: 'wrap', marginBottom: 9 } },
        React.createElement('strong', { style: { fontFamily: 'var(--font-display, sans-serif)', fontSize: 13.5 } }, '신뢰 아키텍처 · 이 제안은 어떻게 산출됐나'),
        React.createElement('span', { style: { fontSize: 10, fontFamily: 'var(--font-mono, monospace)', color: '#5fcf94', background: '#13301f', borderRadius: 4, padding: '2px 7px' } }, '✓ 재현 가능 — 동일 입력 → 동일 수치')
      ),
      React.createElement('div', { style: { display: 'grid', gridTemplateColumns: 'repeat(auto-fit,minmax(180px,1fr))', gap: 8 } },
        ['deterministic', 'domain_rule', 'llm'].map(function (k) {
          var L = LAYER[k];
          return React.createElement('div', { key: k, style: { borderLeft: '2px solid ' + L.color, paddingLeft: 9 } },
            React.createElement(Badge, { provenance: k, full: true }),
            React.createElement('p', { style: { margin: '5px 0 0', fontSize: 10.5, lineHeight: 1.5, color: 'var(--ink-300, #a8aeb6)' } }, L.note)
          );
        })
      ),
      React.createElement('p', { style: { margin: '10px 0 0', fontSize: 10.5, lineHeight: 1.5, color: 'var(--ink-400, #7a8088)' } },
        '원칙: 계산은 코드가, 해석은 LLM이. 수치는 결정론적으로 산출하고 LLM에 산술을 맡기지 않습니다 — 그래서 같은 질문에 항상 같은 답이 나옵니다.')
    );
  }

  // v3.13 — 산출 메커니즘(엔진명·코드vsLLM 인과경로) UI 노출 금지(CLAUDE.md 「명명·UI노출금지」).
  //  render export 3종을 null화해 "신뢰 아키텍처 패널" + "전환 적합도 6축"의 ◆코드 인과경로 행을 동시 제거.
  //  window.TrustArch 헬퍼(LAYER/METRIC/resolveProv)·prov-badge(데이터 tier 뱃지)는 유지(데이터 등급 노출까진 허용).
  var _noTrustRender = function () { return null; };
  window.TrustArch = { LAYER: LAYER, METRIC: METRIC, resolveProv: resolveProv };
  Object.assign(window, { TrustBadge: _noTrustRender, CausalPath: _noTrustRender, TrustPrinciple: _noTrustRender });
})();
