"""Tandem t:connect CSV adapter (pump events).

Simplified header pattern:
  DeviceTimestamp,EventType,BasalRate(U/hr),BolusDelivered(U),CarbInput(g),GlucoseValue(mg/dL),PatientID
"""

import os
import pandas as pd

NAME = "Tandem t:connect"
SENSOR_TYPE = "tandem_pump"

SIGNATURE_HINTS = (
    ("tandem", None),
    (None, "BasalRate"),
)


def matches(path: str) -> bool:
    fname = os.path.basename(path).lower()
    if "tandem" in fname or "tconnect" in fname or "t_connect" in fname:
        return True
    if not path.lower().endswith(".csv"):
        return False
    try:
        with open(path, "r", encoding="utf-8", errors="ignore") as f:
            head = f.read(2048)
        return "BasalRate" in head or "BolusDelivered" in head
    except Exception:
        return False


def parse(path: str) -> pd.DataFrame:
    df = pd.read_csv(path)
    cols = {c.lower(): c for c in df.columns}

    def pick(*keys):
        for k in keys:
            if k in cols:
                return cols[k]
        return None

    ts_col = pick("devicetimestamp", "timestamp", "time")
    basal_col = pick("basalrate(u/hr)", "basalrate", "basal_rate_uph")
    bolus_col = pick("bolusdelivered(u)", "bolusdelivered", "bolus_u")
    carb_col = pick("carbinput(g)", "carbinput", "meal_carb_g")
    glu_col = pick("glucosevalue(mg/dl)", "glucosevalue", "glucose_mg_dl")
    pid_col = pick("patientid", "patient", "subject_id", "subject")

    if ts_col is None:
        return pd.DataFrame()

    out = pd.DataFrame()
    out["subject_id"] = df[pid_col].astype(str) if pid_col else "TDM_SUBJ_01"
    out["timestamp_KST"] = pd.to_datetime(df[ts_col], errors="coerce")
    out["glucose_mg_dl"] = pd.to_numeric(df[glu_col], errors="coerce") if glu_col else pd.NA
    out["sensor_type"] = SENSOR_TYPE
    out["pump_basal_uph"] = pd.to_numeric(df[basal_col], errors="coerce") if basal_col else pd.NA
    out["pump_bolus_u"] = pd.to_numeric(df[bolus_col], errors="coerce") if bolus_col else pd.NA
    out["meal_carb_g"] = pd.to_numeric(df[carb_col], errors="coerce") if carb_col else pd.NA
    out["exercise_flag"] = 0
    out = out.dropna(subset=["timestamp_KST"]).reset_index(drop=True)
    return out
