from __future__ import annotations

from typing import Dict, Iterable, List, Tuple

import pandas as pd

from db.schemas import SkuOverrideUpsert
from normalize import _is_empty


def build_overrides_from_df(df: pd.DataFrame, source: str) -> Tuple[List[SkuOverrideUpsert], List[Tuple[str, str]]]:
    if "sku" not in df.columns:
        raise ValueError("Override CSV must include sku column")
    upserts: List[SkuOverrideUpsert] = []
    deletes: List[Tuple[str, str]] = []
    for _, row in df.iterrows():
        sku = str(row.get("sku", "")).strip()
        if not sku:
            continue
        for col in df.columns:
            if col == "sku":
                continue
            value = row.get(col, "")
            field = str(col).strip()
            if not field:
                continue
            if _is_empty(value):
                deletes.append((sku, field))
                continue
            upserts.append(
                SkuOverrideUpsert(
                    sku=sku,
                    field=field,
                    value=str(value).strip(),
                    source=source,
                )
            )
    return upserts, deletes


def apply_overrides(df: pd.DataFrame, overrides: Dict[str, Dict[str, str]]) -> pd.DataFrame:
    if not overrides:
        return df
    out = df.copy()
    for idx, row in out.iterrows():
        sku = str(row.get("sku", "")).strip()
        if not sku:
            continue
        fields = overrides.get(sku)
        if not fields:
            continue
        for key, value in fields.items():
            if key not in out.columns:
                out[key] = ""
            out.at[idx, key] = value
    return out
