# 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))
