# 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 synthtool as s
from synthtool.languages import java
import glob

# License header
license = """/*
 * Copyright 2019 The Grafeas Authors. All rights reserved.
 *
 * 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.
 */
"""
protobuf_header = "// Generated by the protocol buffer compiler.  DO NOT EDIT!"

# put any special-case replacements here
for file in glob.glob('owl-bot-staging/v1/src/**/*.java', recursive=True):
    if " * Copyright 2021 Google LLC" not in open(file).read() \
        and protobuf_header in open(file).read() \
        and license not in open(file).read():
        s.replace(
            f'owl-bot-staging/v1/src/**/*.java',
            protobuf_header,
            f"{license}\n{protobuf_header}"
        )

# strip out Google-specific parts
# Remove default scope
s.replace(
    f'owl-bot-staging/v1/src/main/java/io/grafeas/v1/GrafeasGrpc.java',
    f"package io.grafeas.v1;",
    f"{license}\npackage io.grafeas.v1;"
)
s.replace(
    f'owl-bot-staging/v1/src/**/GrafeasStubSettings.java',
    r'^(.*)ImmutableList\.<String>builder\(\).add\(".*"\)\.build\(\);',
    '\g<1>ImmutableList.of();'
)
# Remove default service endpoint
s.replace(
    f'owl-bot-staging/v1/src/**/GrafeasStubSettings.java',
    '    return "containeranalysis.googleapis.com:443";',
    '    return null;'
)
# Remove default service endpoint javadoc
s.replace(
    f'owl-bot-staging/v1/src/**/GrafeasStubSettings.java',
    '\s+\*.*default service address.*\n\s+\*.*',
    ''
)
for library in s.get_staging_dirs():
    # put any special-case replacements here
    s.move(library)

s.remove_staging_dirs()
java.common_templates(monorepo=True, excludes=[
    ".github/*",
    ".kokoro/*",
    "samples/*",
    "CODE_OF_CONDUCT.md",
    "CONTRIBUTING.md",
    "LICENSE",
    "SECURITY.md",
    "java.header",
    "license-checks.xml",
    "renovate.json",
    ".gitignore"
])
