"""Import a server-local Master SKU CSV into canonical master catalog tables.

CLI:
    python -m app.jobs.import_master_skus --file /path/to/final_output.csv --source-label master_final_output
"""

from __future__ import annotations

import argparse
import json
import logging
import sys
from pathlib import Path

import pandas as pd

logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__)


def run_import_master_skus(file_path: str, *, source_label: str = "master_sku", dry_run: bool = False) -> dict:
    from db.master_catalog import build_master_sku_import_preview, import_master_sku_dataframe
    from db.session import get_session

    path = Path(file_path)
    if not path.exists() or not path.is_file():
        return {"status": "failed", "error": f"File not found: {file_path}"}
    if path.suffix.lower() != ".csv":
        return {"status": "failed", "error": "Only CSV files are supported"}

    logger.info("Reading Master SKU CSV: %s", path)
    try:
        df = pd.read_csv(path, dtype=str, keep_default_na=False)
    except Exception as exc:
        return {"status": "failed", "error": f"Failed to read CSV: {exc}"}

    if dry_run:
        return {
            "status": "ok",
            "file": str(path),
            "source_label": source_label,
            "dry_run": True,
            "preview": build_master_sku_import_preview(df),
        }

    logger.info("Importing %d rows from %s", len(df), path.name)
    with get_session() as session:
        stats = import_master_sku_dataframe(session, df, source_label=source_label)
        session.commit()
    return {"status": "ok", "file": str(path), "source_label": source_label, **stats}


def main() -> int:
    parser = argparse.ArgumentParser(description="Import a server-local Master SKU CSV")
    parser.add_argument("--file", required=True, help="Path to Master SKU CSV on the server")
    parser.add_argument("--source-label", default="master_sku", help="Import source label")
    parser.add_argument("--dry-run", action="store_true", help="Preview derived fields without writing to the database")
    args = parser.parse_args()

    result = run_import_master_skus(args.file, source_label=args.source_label, dry_run=args.dry_run)
    if result.get("status") != "ok":
        print(result.get("error", "unknown error"), file=sys.stderr)
        return 1

    if args.dry_run:
        print(json.dumps(result, indent=2, sort_keys=True))
        return 0

    print(
        "Master SKU import complete: "
        f"valid_skus={result.get('valid_skus', 0)}, "
        f"inserted={result.get('inserted', 0)}, "
        f"updated={result.get('updated', 0)}, "
        f"unchanged={result.get('unchanged', 0)}, "
        f"attribute_values={result.get('attribute_values', 0)}, "
        f"prices={result.get('prices', 0)}, "
        f"location_availability={result.get('location_availability', 0)}"
    )
    return 0


if __name__ == "__main__":
    sys.exit(main())
