"""units.py — 단위·동위원소 변환 유틸리티.

- TG: mg/dL ↔ mmol/L  (TG 분자량 가정 ~885 g/mol, 트리올레인 기준)
    mmol/L = mg/dL × 0.01129 ;  mg/dL = mmol/L × 88.57
- δ¹³C: ‰ vs PDB ↔ 절대 ¹³C/¹²C 비
    R_sample = (δ/1000 + 1) × R_PDB
- apoB48: μg/mL ↔ mg/L (1:1, 라벨만 토글) / 또는 nmol/L (분자량 264 kDa 가정)

면책: 연구용·참고용.
"""
from __future__ import annotations

# TG 변환계수 (mg/dL → mmol/L). 트리올레인(MW≈885.4) 기준.
TG_MGDL_TO_MMOLL = 0.01129
TG_MMOLL_TO_MGDL = 1.0 / TG_MGDL_TO_MMOLL  # ≈ 88.57

R_PDB = 0.0112372

# apoB48 분자량 가정(약 264 kDa). μg/mL → nmol/L 환산용.
APOB48_KDA = 264.0


def tg_mgdl_to_mmoll(x: float) -> float:
    return x * TG_MGDL_TO_MMOLL


def tg_mmoll_to_mgdl(x: float) -> float:
    return x * TG_MMOLL_TO_MGDL


def delta_to_ratio(delta_permil: float) -> float:
    """δ¹³C(‰) → 절대 ¹³C/¹²C 비."""
    return (delta_permil / 1000.0 + 1.0) * R_PDB


def ratio_to_delta(ratio: float) -> float:
    """절대 ¹³C/¹²C 비 → δ¹³C(‰)."""
    return (ratio / R_PDB - 1.0) * 1000.0


def apob48_ugml_to_nmoll(x_ugml: float) -> float:
    """apoB48 μg/mL → nmol/L. (μg/mL = mg/L; mg/L / MW(g/mmol) × 1e3 = nmol/L)
    MW = 264 kDa = 264000 g/mol = 264000 g per 1000 mmol ... 단순화:
    nmol/L = (mg/L) / (kDa) × 1e3 ... 여기서는 근사식 사용.
    """
    # mg/L ÷ (kDa g/μmol) → μmol/L, ×1000 → nmol/L
    # 264 kDa = 264 g/μmol  → nmol/L = mg/L / 264 * 1e3
    return x_ugml / APOB48_KDA * 1000.0


def apob48_nmoll_to_ugml(x_nmoll: float) -> float:
    return x_nmoll * APOB48_KDA / 1000.0
