from datetime import datetime, timezone

from db.models import ChannelAttributeAlias, MagentoAttributeRegistry, MagentoConnection


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 _add_alias(session, canonical, channel_attr, *, action="use_existing"):
    row = ChannelAttributeAlias(
        channel_code="magento",
        canonical_code=canonical,
        channel_attribute_code=channel_attr,
        mapping_scope="static",
        action=action,
        data_type="text",
        is_active=True,
    )
    session.add(row)
    return row


def test_attribute_preflight_blocks_missing_use_existing_alias(catalog_intent_session):
    from app.jobs.magento_attribute_preflight import analyze_magento_attribute_preflight

    _add_magento_connection(catalog_intent_session)
    _add_alias(catalog_intent_session, "door_style", "door_style")
    catalog_intent_session.commit()

    result = analyze_magento_attribute_preflight(catalog_intent_session, connection_id=2)

    assert result["status"] == "blocked"
    assert result["missing_use_existing_count"] == 1
    assert result["missing_aliases"][0]["channel_attribute_code"] == "door_style"


def test_attribute_preflight_marks_missing_alias_create_new(catalog_intent_session):
    from app.jobs.magento_attribute_preflight import (
        analyze_magento_attribute_preflight,
        mark_missing_aliases_create_new,
    )

    _add_magento_connection(catalog_intent_session)
    existing = _add_alias(catalog_intent_session, "brand", "brand")
    missing = _add_alias(catalog_intent_session, "door_style", "door_style")
    catalog_intent_session.flush()
    catalog_intent_session.add(
        MagentoAttributeRegistry(
            connection_id=2,
            attribute_code="brand",
            attribute_id=10,
            frontend_label="Brand",
            frontend_input="text",
            backend_type="varchar",
            is_user_defined=True,
            fetched_at=datetime.now(timezone.utc),
        )
    )
    catalog_intent_session.commit()

    marked = mark_missing_aliases_create_new(catalog_intent_session, connection_id=2)
    catalog_intent_session.commit()

    assert marked["marked_count"] == 1
    assert existing.action == "use_existing"
    assert missing.action == "create_new"

    result = analyze_magento_attribute_preflight(catalog_intent_session, connection_id=2)
    assert result["status"] == "needs_provision"
    assert result["missing_create_new_count"] == 1
