"""Reassign shared SKU images from native/base SKUs resolved by manual taxonomy.

Examples:
  python -m app.jobs.reassign_shared_sku_images --collection-path-slug kitchen-cabinets/anna-caramel-harvest --dry-run
  python -m app.jobs.reassign_shared_sku_images --collection-code ACH --apply
  python -m app.jobs.reassign_shared_sku_images --all-shared --manifest-file "E:\\2026\\manifest-2026-06-16.csv" --apply
"""

from __future__ import annotations

import argparse
import json
from typing import Any, Dict, Optional, Sequence


def reassign_shared_sku_images(
    *,
    master_skus: Optional[Sequence[str]] = None,
    collection_path_slugs: Optional[Sequence[str]] = None,
    collection_codes: Optional[Sequence[str]] = None,
    all_shared: bool = False,
    apply: bool = False,
    manifest_files: Optional[Sequence[str]] = None,
) -> Dict[str, Any]:
    from app.jobs.import_master_image_manifest import import_master_image_manifest
    from db.session import get_session
    from db.shared_sku_image_cleanup import sync_shared_sku_images_from_manual_taxonomy

    manifest_result = None
    if manifest_files:
        manifest_result = import_master_image_manifest(
            files=list(manifest_files),
            apply=bool(apply),
            source_label="shared_sku_image_reassign_manifest",
        )

    with get_session() as session:
        result = sync_shared_sku_images_from_manual_taxonomy(
            session,
            master_skus=master_skus,
            collection_path_slugs=collection_path_slugs,
            collection_codes=collection_codes,
            all_shared=all_shared,
            dry_run=not apply,
        )
        if apply:
            session.commit()
        else:
            session.rollback()

    return {
        "status": "ok",
        "applied": bool(apply),
        "manifest_import": manifest_result,
        "shared_sync": result,
    }


def main(argv: Optional[Sequence[str]] = None) -> int:
    parser = argparse.ArgumentParser(description="Reassign shared SKU images from manual taxonomy base SKUs")
    parser.add_argument("--master-sku", action="append", default=[], help="Limit to one master SKU; repeatable")
    parser.add_argument("--collection-path-slug", action="append", default=[], help="Limit to one collection path slug; repeatable")
    parser.add_argument("--collection-code", action="append", default=[], help="Limit to one collection code; repeatable")
    parser.add_argument("--manifest-file", action="append", default=[], help="Optional image manifest CSV to import first; repeatable")
    parser.add_argument("--all-shared", action="store_true", help="Process every shared SKU")
    parser.add_argument("--apply", action="store_true", help="Commit changes; default is dry-run")
    parser.add_argument("--dry-run", action="store_true", help="Preview only")
    args = parser.parse_args(list(argv) if argv is not None else None)

    if args.apply and args.dry_run:
        parser.error("Use only one of --apply or --dry-run")
    if not args.apply and not args.dry_run:
        parser.error("Pass --dry-run or --apply")

    result = reassign_shared_sku_images(
        master_skus=args.master_sku,
        collection_path_slugs=args.collection_path_slug,
        collection_codes=args.collection_code,
        all_shared=bool(args.all_shared),
        apply=bool(args.apply),
        manifest_files=args.manifest_file,
    )
    print(json.dumps(result, indent=2, default=str))
    return 0


if __name__ == "__main__":
    raise SystemExit(main())
