"""Ensure Magento Samples hub category and assign all sample-door products.

CLI:
    python -m app.jobs.magento_sample_category_sync --connection-id 4
    python -m app.jobs.magento_sample_category_sync --connection-id 4 --apply
    python -m app.jobs.magento_sample_category_sync --connection-id 4 --apply --skus ACH-SD,ASW-SD
"""

from __future__ import annotations

import argparse
import json
import logging
import sys
from typing import Any, Dict, List, Optional

from db.sample_category import (
    DEFAULT_SAMPLE_PATH_SLUG,
    DEFAULT_SAMPLE_REMOTE_PATH,
    DEFAULT_SAMPLE_TITLE,
    sync_magento_sample_hub,
)
from db.session import get_session

logger = logging.getLogger(__name__)


def run_magento_sample_category_sync(
    *,
    connection_id: int,
    dry_run: bool = True,
    path_slug: str = DEFAULT_SAMPLE_PATH_SLUG,
    remote_path: str = DEFAULT_SAMPLE_REMOTE_PATH,
    title: str = DEFAULT_SAMPLE_TITLE,
    assign_products: bool = True,
    create_missing_master: bool = True,
    create_missing_magento: bool = True,
    skus: Optional[List[str]] = None,
) -> Dict[str, Any]:
    with get_session() as session:
        result = sync_magento_sample_hub(
            session,
            connection_id=connection_id,
            path_slug=path_slug,
            remote_path=remote_path,
            title=title,
            dry_run=dry_run,
            assign_products=assign_products,
            create_missing_master=create_missing_master,
            create_missing_magento=create_missing_magento,
            master_skus=skus,
        )
        if not dry_run:
            session.commit()
        return result


def main() -> int:
    logging.basicConfig(level=logging.INFO)
    parser = argparse.ArgumentParser(
        description="Create Magento Samples hub and assign sample-door products",
    )
    parser.add_argument("--connection-id", type=int, required=True)
    parser.add_argument("--dry-run", dest="dry_run", action="store_true", default=True)
    parser.add_argument("--apply", dest="dry_run", action="store_false")
    parser.add_argument("--path-slug", default=DEFAULT_SAMPLE_PATH_SLUG)
    parser.add_argument(
        "--remote-path",
        default=DEFAULT_SAMPLE_REMOTE_PATH,
        help="Magento category display path/name under Default Category (default: Samples)",
    )
    parser.add_argument("--title", default=DEFAULT_SAMPLE_TITLE)
    parser.add_argument(
        "--no-assign-products",
        dest="assign_products",
        action="store_false",
        help="Only ensure the Samples category + listing path target",
    )
    parser.add_argument(
        "--no-create-missing-master",
        dest="create_missing_master",
        action="store_false",
        help="Do not auto-create missing sample-door master_product rows",
    )
    parser.add_argument(
        "--no-create-missing-magento",
        dest="create_missing_magento",
        action="store_false",
        help="Do not auto-create Magento products when assign returns 404",
    )
    parser.add_argument(
        "--skus",
        default=None,
        help="Optional comma-separated master SKUs (default: discover all sample doors)",
    )
    args = parser.parse_args()
    sku_list = None
    if args.skus:
        sku_list = [part.strip() for part in str(args.skus).split(",") if part.strip()]
    result = run_magento_sample_category_sync(
        connection_id=args.connection_id,
        dry_run=args.dry_run,
        path_slug=args.path_slug,
        remote_path=args.remote_path,
        title=args.title,
        assign_products=args.assign_products,
        create_missing_master=args.create_missing_master,
        create_missing_magento=args.create_missing_magento,
        skus=sku_list,
    )
    print(json.dumps(result, indent=2, default=str))
    errors = result.get("errors") or []
    return 1 if errors else 0


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