# tests/fixtures/customer_fixtures.py
"""
Customer-related test fixtures.

Note: Fixtures should NOT use db.expunge() as it breaks lazy loading.
See tests/conftest.py for details on fixture best practices.
"""
import pytest

from models.database.customer import Customer, CustomerAddress
from models.database.order import Order


@pytest.fixture
def test_customer(db, test_vendor):
    """Create a test customer."""
    customer = Customer(
        vendor_id=test_vendor.id,
        email="testcustomer@example.com",
        hashed_password="hashed_password",
        first_name="John",
        last_name="Doe",
        customer_number="TEST001",
        is_active=True,
    )
    db.add(customer)
    db.commit()
    db.refresh(customer)
    return customer


@pytest.fixture
def test_customer_address(db, test_vendor, test_customer):
    """Create a test customer address."""
    address = CustomerAddress(
        vendor_id=test_vendor.id,
        customer_id=test_customer.id,
        address_type="shipping",
        first_name="John",
        last_name="Doe",
        address_line_1="123 Main St",
        city="Luxembourg",
        postal_code="L-1234",
        country="Luxembourg",
        is_default=True,
    )
    db.add(address)
    db.commit()
    db.refresh(address)
    return address


@pytest.fixture
def test_order(db, test_vendor, test_customer, test_customer_address):
    """Create a test order."""
    order = Order(
        vendor_id=test_vendor.id,
        customer_id=test_customer.id,
        order_number="TEST-ORD-001",
        status="pending",
        subtotal=99.99,
        total_amount=99.99,
        currency="EUR",
        shipping_address_id=test_customer_address.id,
        billing_address_id=test_customer_address.id,
    )
    db.add(order)
    db.commit()
    db.refresh(order)
    return order
