from __future__ import annotations

from typing import Any, Dict, List, Optional, Tuple

import pandas as pd
from sqlalchemy.orm import Session

from magento.catalog_normalize import normalize_master_catalog_df
from magento.master_catalog_rows import build_magento_snapshot_rows_from_master
from settings import load_attribute_registry_codes, load_attribute_registry_options, load_db_config, load_magento_config


def load_normalized_snapshot_rows(
    session: Session,
    *,
    connection_id: int,
    sku_list: Optional[List[str]] = None,
) -> Tuple[List[Dict[str, Any]], List[str], Dict[str, Any]]:
    """Build Magento-normalized snapshot rows from the master catalog channel pipeline."""
    from db.channel_exports import resolve_push_skus

    meta: Dict[str, Any] = {"source": "master", "connection_id": connection_id}

    wanted = sorted(
        resolve_push_skus(
            session,
            "magento",
            skus=sku_list,
            only_assigned=True,
        )
    )
    meta["sku_count"] = len(wanted)
    if not wanted:
        return [], [], meta

    snapshot_rows_preflight = build_magento_snapshot_rows_from_master(
        session,
        skus=wanted,
        only_assigned=False,
        connection_id=connection_id,
    )
    snapshot_df = pd.DataFrame(snapshot_rows_preflight)

    cfg = load_magento_config()
    registry_codes = load_attribute_registry_codes(load_db_config().attribute_registry_path)
    registry_options = load_attribute_registry_options(load_db_config().attribute_registry_path)
    normalized_df, _ = normalize_master_catalog_df(
        snapshot_df,
        cfg,
        allowed_attribute_codes=registry_codes or None,
        allowed_attribute_options=registry_options or None,
    )
    rows = normalized_df.to_dict(orient="records")
    meta["row_count"] = len(rows)
    return rows, wanted, meta
