from layercake.dateutils import now
from layercake.dynamodb import DynamoDBPersistenceLayer, KeyPair


def update_policies(
    id: str,
    /,
    payment_policy: dict | None = None,
    billing_policy: dict | None = None,
    *,
    persistence_layer: DynamoDBPersistenceLayer,
):
    now_ = now()
    payment_sk = 'metadata#payment_policy'
    billing_sk = 'metadata#billing_policy'

    with persistence_layer.transact_writer() as transact:
        if payment_policy:
            transact.put(
                item={
                    'id': id,
                    'sk': payment_sk,
                    'created_at': now_,
                }
                | payment_policy
            )
        else:
            transact.delete(key=KeyPair(id, payment_sk))

        if billing_policy:
            transact.put(
                item={
                    'id': id,
                    'sk': billing_sk,
                    'created_at': now_,
                }
                | billing_policy
            )
            transact.put(
                item={
                    'id': 'SUBSCRIPTION',
                    'sk': f'ORG#{id}',
                    'created_at': now_,
                }
            )
        else:
            transact.delete(key=KeyPair(id, billing_sk))
            transact.delete(key=KeyPair('SUBSCRIPTION', f'ORG#{id}'))

    return True
