"""Minimal Magento write probe for one SKU.

Useful for confirming OAuth/path handling on slash-bearing SKUs before running
larger repair jobs.

Examples:
  python -m app.jobs.test_magento_product_write --connection-id 4 --sku 'ACH-BBC36/39L/R' --field visibility --value 1
  python -m app.jobs.test_magento_product_write --connection-id 4 --sku 'ACH-BBC36/39L/R' --field status --value 1
"""

from __future__ import annotations

import argparse
import json
from typing import Any, Dict

from db.session import get_session
from magento.magento_api import MagentoRestClient
from magento.oauth_client import MagentoOAuthClient, build_magento_oauth_kwargs


def _api_for_connection(session, connection_id: int) -> MagentoRestClient:
    from db.magento_repositories import SqlAlchemyMagentoConnectionRepository

    conn = SqlAlchemyMagentoConnectionRepository(session).get_for_sync(connection_id)
    if not conn:
        raise ValueError(f"Magento connection {connection_id} not found")
    oauth = MagentoOAuthClient(**build_magento_oauth_kwargs(conn))
    return MagentoRestClient(oauth)


def run_probe(*, connection_id: int, sku: str, field: str, value: Any) -> Dict[str, Any]:
    with get_session() as session:
        api = _api_for_connection(session, connection_id)
        before = api.get_product(sku)
        status, body = api.put_product(sku, {"sku": sku, field: value})
        after = api.get_product(sku)
        return {
            "status": "ok",
            "connection_id": connection_id,
            "sku": sku,
            "field": field,
            "value": value,
            "before": before.get(field) if before else None,
            "write_status": status,
            "write_body": body,
            "after": after.get(field) if after else None,
        }


def main() -> int:
    parser = argparse.ArgumentParser(description="Minimal Magento write probe for one SKU")
    parser.add_argument("--connection-id", type=int, required=True)
    parser.add_argument("--sku", required=True)
    parser.add_argument("--field", default="visibility")
    parser.add_argument("--value", required=True)
    args = parser.parse_args()

    raw_value = args.value
    try:
        value: Any = int(raw_value)
    except ValueError:
        value = raw_value

    result = run_probe(
        connection_id=args.connection_id,
        sku=args.sku,
        field=args.field,
        value=value,
    )
    print(json.dumps(result, indent=2, default=str))
    return 0


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