"""
Retry Digistore orders that failed to sync to Shopify.

Skips refunded/cancelled purchases (local DB status or live Digistore billing).
Omits SKIP_DIGISTORE_PRODUCT_IDS (default: 693295) from Shopify line items.

Usage:
  python manage.py retry_failed_orders --dry-run
  python manage.py retry_failed_orders --sync-error-contains 693295
  python manage.py retry_failed_orders --digistore-order-id Y23EV4MR1
  python manage.py retry_failed_orders --limit 50
"""
from django.core.management.base import BaseCommand

from orders.services import OrderService


class Command(BaseCommand):
    help = (
        "Retry failed Digistore→Shopify order imports. "
        "Skips refunded/cancelled orders and omitted Digistore product IDs."
    )

    def add_arguments(self, parser):
        parser.add_argument(
            "--sync-error-contains",
            type=str,
            default="",
            help="Only retry orders whose sync_error contains this text.",
        )
        parser.add_argument(
            "--digistore-order-id",
            type=str,
            default="",
            help="Retry a single Digistore order id.",
        )
        parser.add_argument(
            "--limit",
            type=int,
            default=500,
            help="Maximum orders to examine (default: 500).",
        )
        parser.add_argument(
            "--dry-run",
            action="store_true",
            help="Report actions without creating Shopify orders or updating the DB.",
        )
        parser.add_argument(
            "--no-refresh",
            action="store_true",
            help="Use stored raw_payload instead of live Digistore getPurchase.",
        )

    def handle(self, *args, **options):
        result = OrderService.retry_failed_orders_to_shopify(
            sync_error_contains=options.get("sync_error_contains") or "",
            digistore_order_id=options.get("digistore_order_id") or "",
            limit=int(options.get("limit") or 500),
            dry_run=bool(options.get("dry_run")),
            refresh_from_digistore=not bool(options.get("no_refresh")),
        )

        self.stdout.write(
            f"Examined: {result.get('examined')}\n"
            f"Created: {result.get('created')}\n"
            f"Skipped: {result.get('skipped')}\n"
            f"Failed: {result.get('failed')}\n"
        )
        if options.get("dry_run"):
            self.stdout.write(
                self.style.WARNING(
                    f"DRY RUN — would create: {result.get('dry_run_would_create')}\n"
                )
            )

        for row in result.get("details") or []:
            oid = row.get("digistore_order_id") or "?"
            outcome = row.get("result")
            if outcome == "created":
                self.stdout.write(
                    self.style.SUCCESS(
                        f"  {oid} -> Shopify {row.get('shopify_order_id')}"
                    )
                )
            elif outcome == "skipped":
                self.stdout.write(f"  {oid} skipped ({row.get('reason')})")
            elif outcome == "failed":
                self.stderr.write(
                    self.style.ERROR(f"  {oid} failed: {row.get('error')}")
                )
            elif outcome == "dry_run_would_create":
                self.stdout.write(f"  {oid} would create")
