import app
from aws_lambda_powertools.utilities.feature_flags import RuleAction, FeatureFlags, AppConfigStore


def init_feature_flags(mocker, mock_schema, envelope="") -> FeatureFlags:
    """Mock AppConfig Store get_configuration method to use mock schema instead"""

    method_to_mock = "aws_lambda_powertools.utilities.feature_flags.AppConfigStore.get_configuration"
    mocked_get_conf = mocker.patch(method_to_mock)
    mocked_get_conf.return_value = mock_schema

    app_conf_store = AppConfigStore(
        environment="test_env",
        application="test_app",
        name="test_conf_name",
        envelope=envelope,
    )

    return FeatureFlags(store=app_conf_store)


def test_app_returns_products():
    products = app.products()

    assert len(products) == 2
    assert products[0]["price"] == 3549
    assert products[1]["price"] == 6349


def test_app_retuns_product_by_id():
    products = app.products_by_id("1")

    assert products[0]['name'] == 'Mechanical Keyboard 9000'
    assert products[0]['price'] == 3549


def test_app_adds_discount_for_all_users(mocker):
    product = [{"productId": "1", "name": "Mechanical Keyboard 9000", "price": 3549}]
    mocked_app_config_schema = {
        "discount": {
            "default": True
        }
    }

    init_feature_flags(mocker=mocker, mock_schema=mocked_app_config_schema)

    product_with_discount = app.add_discount(product)
    assert product_with_discount[0]["discount"] == "10%"


def test_app_adds_discount_for_premium_users(mocker):
    product = [{"productId": "1", "name": "Mechanical Keyboard 9000", "price": 3549}]
    mocked_app_config_schema = {
        "discount": {
            "default": True
        },
        "premium_features": {
            "default": False,
            "rules": {
                "customer tier equals premium": {
                    "when_match": True,
                    "conditions": [
                        {
                            "action": RuleAction.EQUALS.value,
                            "key": "tier",
                            "value": "premium"
                        }
                    ]
                }
            }
        },
    }

    init_feature_flags(mocker=mocker, mock_schema=mocked_app_config_schema)

    product_with_discount = app.add_discount(product)
    assert product_with_discount[0]["discount"] == "20%"