# Copyright 2021 Google LLC

# 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

#     https://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.


import pathlib
import shutil
import subprocess
import tempfile

import describe
import changesummary


SCRIPTS_DIR = pathlib.Path(__file__).parent.resolve()
DISCOVERY_DOC_DIR = SCRIPTS_DIR / ".." / "googleapiclient" / "discovery_cache" / "documents"
REFERENCE_DOC_DIR = SCRIPTS_DIR / ".." / "docs" / "dyn"
TEMP_DIR = SCRIPTS_DIR / "temp"

# Clear discovery documents and reference documents directory
shutil.rmtree(DISCOVERY_DOC_DIR, ignore_errors=True)
shutil.rmtree(REFERENCE_DOC_DIR, ignore_errors=True)

# Clear temporary directory
shutil.rmtree(TEMP_DIR, ignore_errors=True)

# Check out a fresh copy
subprocess.call(['git', 'checkout', DISCOVERY_DOC_DIR])
subprocess.call(['git', 'checkout', REFERENCE_DOC_DIR])

# Snapshot current discovery artifacts to a temporary directory
with tempfile.TemporaryDirectory() as current_discovery_doc_dir:
    shutil.copytree(DISCOVERY_DOC_DIR, current_discovery_doc_dir, dirs_exist_ok=True)

    # Download discovery artifacts and generate documentation
    describe.generate_all_api_documents()

    # Get a list of files changed using `git diff`
    git_diff_output = subprocess.check_output(['git',
                                      'diff',
                                      'origin/master',
                                      '--name-only',
                                      '--',
                                      DISCOVERY_DOC_DIR / '*.json',
                                      REFERENCE_DOC_DIR / '*.html',
                                      REFERENCE_DOC_DIR / '*.md',
                                      ],
                                      universal_newlines=True)

    # Create lists of the changed files
    all_changed_files = [pathlib.Path(file_name).name for file_name in git_diff_output.split('\n')]
    json_changed_files = [file for file in all_changed_files if file.endswith(".json")]

    # Create temporary directory
    pathlib.Path(TEMP_DIR).mkdir()

    # Analyze the changes in discovery artifacts using the changesummary module
    changesummary.ChangeSummary(DISCOVERY_DOC_DIR, current_discovery_doc_dir, TEMP_DIR, json_changed_files).detect_discovery_changes()

    # Write a list of the files changed to a file called `changed files` which will be used in the `createcommits.sh` script.
    with open(TEMP_DIR / "changed_files", "w") as f:
        f.writelines('\n'.join(all_changed_files))
