#!/usr/bin/env python3
#
# Automatically create or update the .expected files in the
# cache key test directory.
#
# Simply run without any arguments, from anywhere, e.g.:
#
#   PYTHONPATH=. ./tests/cachekey/update.py
#
# After this, add any files which were newly created and commit
# the result in order to adjust the cache key test to changed
# keys.
#
import os
import tempfile
from tests.testutils.runcli import Cli

# This weird try / except is needed, because this will be imported differently
# when pytest runner imports them vs when you run the updater directly from
# this directory.
try:
    from cachekey import element_filename, parse_output_keys, load_expected_keys
except ImportError:
    from .cachekey import element_filename, parse_output_keys, load_expected_keys

# Project directory
PROJECT_DIR = os.path.join(
    os.path.dirname(os.path.realpath(__file__)),
    "project",
)


def write_expected_key(element_name, actual_key):
    expected_file = element_filename(PROJECT_DIR, element_name, 'expected')
    with open(expected_file, 'w') as f:
        f.write(actual_key)


def update_keys():

    with tempfile.TemporaryDirectory(dir=PROJECT_DIR) as tmpdir:
        directory = os.path.join(tmpdir, 'cache')
        os.makedirs(directory)
        cli = Cli(directory, verbose=False)

        # Run bst show
        result = cli.run(project=PROJECT_DIR, silent=True, args=[
            '--no-colors',
            'show', '--format', '%{name}::%{full-key}',
            'target.bst'
        ])

        # Load the actual keys, and the expected ones if they exist
        actual_keys = parse_output_keys(result.output)
        expected_keys = load_expected_keys(PROJECT_DIR, actual_keys, raise_error=False)

        for element_name in actual_keys:
            expected = element_filename(PROJECT_DIR, element_name, 'expected')

            if actual_keys[element_name] != expected_keys[element_name]:
                if not expected_keys[element_name]:
                    print("Creating new expected file: {}".format(expected))
                else:
                    print("Updating expected file: {}".format(expected))

                write_expected_key(element_name, actual_keys[element_name])


if __name__ == '__main__':
    update_keys()
