from datetime import datetime, timezone

from db.models import (
    ChannelListingPath,
    MagentoCategoryRegistry,
    MagentoConnection,
    ProductListingPathAssignment,
)


def _add_magento_connection(session, connection_id=2):
    session.add(
        MagentoConnection(
            id=connection_id,
            tenant_id="test",
            store_base_url=f"https://magento-{connection_id}.test",
            magento_api_base_url=f"https://magento-{connection_id}.test",
            rest_base_path="V1",
            environment="test",
            consumer_key="ck",
            consumer_secret="cs",
            access_token="at",
            access_token_secret="ats",
            status="active",
        )
    )
    session.flush()


def test_bootstrap_check_blocks_backend_listing_title_crossed_hub(catalog_intent_session):
    from app.jobs.magento_site_bootstrap_check import analyze_magento_site_bootstrap

    catalog_intent_session.add(
        ChannelListingPath(
            path_slug="kitchen-cabinets",
            path_kind="hub",
            title="Bathroom Vanities",
            is_active=True,
        )
    )
    catalog_intent_session.commit()

    result = analyze_magento_site_bootstrap(
        catalog_intent_session,
        connection_id=2,
        provision_result={"samples": {"magento_categories": [{"path": "Kitchen Cabinets"}]}},
    )

    assert result["status"] == "blocked"
    assert result["blocking_issue_count"] == 1
    assert result["issues"][0]["code"] == "backend_listing_title_conflict"


def test_bootstrap_check_blocks_magento_registry_crossed_hub(catalog_intent_session):
    from app.jobs.magento_site_bootstrap_check import analyze_magento_site_bootstrap

    _add_magento_connection(catalog_intent_session)
    catalog_intent_session.add(
        MagentoCategoryRegistry(
            connection_id=2,
            category_id=44,
            parent_id=2,
            name="Bathroom Vanities",
            path="1/2/44",
            path_names="Kitchen Cabinets/Bathroom Vanities",
            level=2,
            is_active=True,
            fetched_at=datetime.now(timezone.utc),
        )
    )
    catalog_intent_session.commit()

    result = analyze_magento_site_bootstrap(
        catalog_intent_session,
        connection_id=2,
        provision_result={"samples": {"magento_categories": [{"path": "Kitchen Cabinets"}]}},
    )

    codes = {issue["code"] for issue in result["issues"]}
    assert result["status"] == "blocked"
    assert "magento_registry_hub_conflict" in codes


def test_bootstrap_check_passes_clean_kitchen_plan(catalog_intent_session):
    from app.jobs.magento_site_bootstrap_check import analyze_magento_site_bootstrap

    _add_magento_connection(catalog_intent_session)
    catalog_intent_session.add(
        ChannelListingPath(
            path_slug="kitchen-cabinets",
            path_kind="hub",
            title="Kitchen Cabinets",
            is_active=True,
        )
    )
    catalog_intent_session.add(
        MagentoCategoryRegistry(
            connection_id=2,
            category_id=10,
            parent_id=2,
            name="Kitchen Cabinets",
            path="1/2/10",
            path_names="Kitchen Cabinets",
            level=2,
            is_active=True,
            fetched_at=datetime.now(timezone.utc),
        )
    )
    catalog_intent_session.commit()

    result = analyze_magento_site_bootstrap(
        catalog_intent_session,
        connection_id=2,
        provision_result={"samples": {"magento_categories": [{"path": "Kitchen Cabinets"}]}},
    )

    assert result["status"] == "ok"
    assert result["issue_count"] == 0


def test_deactivate_conflicting_backend_listing_paths_inactivates_assignments(catalog_intent_session):
    from app.jobs.magento_site_bootstrap_check import (
        analyze_magento_site_bootstrap,
        deactivate_conflicting_backend_listing_paths,
    )

    bad_path = ChannelListingPath(
        path_slug="kitchen-cabinets/vanity",
        path_kind="facet",
        title="Vanity",
        is_active=True,
    )
    catalog_intent_session.add(bad_path)
    catalog_intent_session.flush()
    catalog_intent_session.add(
        ProductListingPathAssignment(
            master_sku="SKU-1",
            listing_path_id=bad_path.id,
            assignment_status="active",
            match_source="test",
        )
    )
    catalog_intent_session.commit()

    planned = deactivate_conflicting_backend_listing_paths(catalog_intent_session, dry_run=True)
    assert planned["planned_assignment_count"] == 1
    assert planned["deactivated_listing_paths"] == 0
    assert bad_path.is_active is True

    applied = deactivate_conflicting_backend_listing_paths(catalog_intent_session, dry_run=False)
    catalog_intent_session.commit()

    assert applied["deactivated_listing_paths"] == 1
    assert applied["deactivated_assignments"] == 1
    assert bad_path.is_active is False
    assignment = catalog_intent_session.get(ProductListingPathAssignment, 1)
    assert assignment.assignment_status == "inactive"

    result = analyze_magento_site_bootstrap(
        catalog_intent_session,
        connection_id=2,
        provision_result={"samples": {"magento_categories": [{"path": "Kitchen Cabinets"}]}},
    )
    assert result["status"] == "ok"
