import pytest

from test_products_inventory import headers, product, workspace

pytest_plugins = ("test_workspace",)


def test_safe_variant_and_conversion_editing(client,verified_user):
    data=workspace(client,verified_user,"Nested Edit")
    business=data["business"]["id"]

    units=client.get(
        f"/api/businesses/{business}/units",
        headers=headers(verified_user),
    ).json()

    if not units:
        unit=client.post(
            f"/api/businesses/{business}/units",
            json={"name":"Piece","symbol":"pc"},
            headers=headers(verified_user),
        ).json()
    else:
        unit=units[0]

    variation=product(
        client,
        verified_user,
        business,
        "Variation Edit",
        product_type="VARIATION",
        variants=[{
            "name":"Red",
            "attributes":{"Color":"Red"},
            "sku":"VAR-RED",
            "selling_price":"20",
        }],
    ).json()

    detail=client.get(
        f"/api/businesses/{business}/products/{variation['id']}",
        headers=headers(verified_user),
    ).json()

    variant=detail["variants"][0]

    response=client.patch(
        f"/api/businesses/{business}/products/{variation['id']}/variants/{variant['id']}",
        json={
            "name":"Crimson",
            "selling_price":"25",
            "is_active":False,
        },
        headers=headers(verified_user),
    )
    assert response.status_code==200
    assert response.json()["name"]=="Crimson"
    assert response.json()["is_active"] is False

    added=client.post(
        f"/api/businesses/{business}/products/{variation['id']}/variants",
        json={
            "name":"Blue",
            "attributes":{"Color":"Blue"},
            "sku":"VAR-BLUE",
            "selling_price":"22",
        },
        headers=headers(verified_user),
    )
    assert added.status_code==201

    pack=product(
        client,
        verified_user,
        business,
        "Pack Edit",
        product_type="PIECES_PACK",
        base_unit_id=unit["id"],
        conversions=[{
            "unit_id":unit["id"],
            "quantity_in_base":"12",
            "selling_price":"100",
            "is_selling_unit":True,
        }],
    ).json()

    pack_detail=client.get(
        f"/api/businesses/{business}/products/{pack['id']}",
        headers=headers(verified_user),
    ).json()

    conversion=pack_detail["conversions"][0]

    updated=client.patch(
        f"/api/businesses/{business}/products/{pack['id']}/conversions/{conversion['id']}",
        json={
            "quantity_in_base":"24",
            "selling_price":"190",
        },
        headers=headers(verified_user),
    )
    assert updated.status_code==200
    assert updated.json()["quantity_in_base"]==24

    # Existing IDs are preserved: editing does not delete/recreate nested rows.
    refreshed=client.get(
        f"/api/businesses/{business}/products/{variation['id']}",
        headers=headers(verified_user),
    ).json()
    assert any(row["id"]==variant["id"] and row["name"]=="Crimson" for row in refreshed["variants"])

    refreshed_pack=client.get(
        f"/api/businesses/{business}/products/{pack['id']}",
        headers=headers(verified_user),
    ).json()
    assert any(row["id"]==conversion["id"] for row in refreshed_pack["conversions"])
