# Copyright (c) 2016 Hewlett-Packard Enterprise Development Company, L.P.
#
# Licensed under the Apache License, Version 2.0 (the "License"); you may
# not use this file except in compliance with the License. You may obtain
# a copy of the License at
#
#      http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
# License for the specific language governing permissions and limitations
# under the License.
"""Custom hooks for betamax and keystoneauth.

   Module providing a set of hooks specially designed for
   interacting with clouds and keystone authentication.

:author: Yolanda Robla
"""

import json
import typing as ty

from betamax import cassette


def mask_fixture_values(
    nested: dict[str, ty.Any], prev_key: str | None
) -> None:
    for key, value in nested.items():
        if isinstance(value, dict):
            mask_fixture_values(value, key)
        else:
            if key in ('tenantName', 'username'):
                nested[key] = 'dummy'
            elif prev_key in ('user', 'project', 'tenant') and key == 'name':
                nested[key] = 'dummy'
            elif prev_key == 'domain' and key == 'id':
                nested[key] = 'dummy'
            elif key == 'password':
                nested[key] = '********'
            elif prev_key == 'token' and key in ('expires', 'expires_at'):
                nested[key] = '9999-12-31T23:59:59Z'


def pre_record_hook(
    interaction: cassette.Interaction, cassette: cassette.Cassette
) -> None:
    """Hook to mask saved data.

    This hook will be triggered before saving the interaction, and
    will perform two tasks:
    - mask user, project and password in the saved data
    - set token expiration time to an inifinite time.
    """
    request_body = interaction.data['request']['body']
    if request_body.get('string'):
        parsed_content = json.loads(request_body['string'])
        mask_fixture_values(parsed_content, None)
        request_body['string'] = json.dumps(parsed_content)

    response_body = interaction.data['response']['body']
    if response_body.get('string'):
        parsed_content = json.loads(response_body['string'])
        mask_fixture_values(parsed_content, None)
        response_body['string'] = json.dumps(parsed_content)
