"""
Scheduled Magento sync: enqueue sync for all active connections.
Run via cron at MAGENTO_SCHEDULED_SYNC_TIME_UTC (e.g. 11:00 UTC = 0300 PST).

CLI: python -m app.jobs.magento_scheduled_sync
Cron: 0 11 * * * cd /path && python -m app.jobs.magento_scheduled_sync

On-demand sync: POST /api/magento/sync or Publish page. Automated schedules: channel_schedule via UI (#/scheduled).
"""

from __future__ import annotations

import logging
import sys
from datetime import datetime, timezone

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


def run_scheduled_sync() -> dict:
    import os
    from db.session import get_session
    from db.magento_repositories import (
        SqlAlchemyMagentoConnectionRepository,
        SqlAlchemyMagentoSyncQueueRepository,
        SqlAlchemyPlytixFeedEventRepository,
    )
    from settings import load_email_config

    from magento.sync_defaults import default_magento_queue_options

    label = f"scheduled-{datetime.now(timezone.utc).strftime('%Y%m%d-%H%M')}"
    notify_email = load_email_config().to_default or None
    options = default_magento_queue_options()
    if notify_email:
        options["notify_email"] = notify_email
    if os.getenv("MAGENTO_SCHEDULED_FORCE_FULL_SYNC", "").strip().lower() in ("1", "true", "yes"):
        options["force_full_sync"] = True

    with get_session() as session:
        conn_repo = SqlAlchemyMagentoConnectionRepository(session)
        queue_repo = SqlAlchemyMagentoSyncQueueRepository(session)
        feed_repo = SqlAlchemyPlytixFeedEventRepository(session)
        conns = conn_repo.list_connections()
        ids = [c.id for c in conns if c.status == "active"]
        if not ids:
            return {"status": "ok", "message": "No active connections", "queued": 0}
        feed_repo.create(label, "scheduled", {"connection_ids": ids})
        for cid in ids:
            queue_repo.enqueue(cid, label, options=options)
        session.commit()
    return {"status": "ok", "label": label, "queued": len(ids)}


def main() -> int:
    result = run_scheduled_sync()
    if result.get("status") != "ok":
        print(result.get("message", "unknown error"), file=sys.stderr)
        return 1
    print(f"Scheduled sync queued: {result.get('queued', 0)} connections, label={result.get('label', '')}")
    return 0


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