#!/usr/bin/env python3

#
# Copyright 2019, The Android Open Source Project
#
# 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.
#

"""Script that will remind developers to run updateApi."""

import argparse
import os.path
import sys



WARNING_COLOR = '\033[33m'
END_COLOR = '\033[0m'

WARNING_NO_API_FILES = """
{}**********************************************************************
You changed library classes, but you have no current.txt changes.
Did you forget to run ./gradlew updateApi?
**********************************************************************{}
""".format(WARNING_COLOR, END_COLOR)

WARNING_OLD_API_FILES = """
{}**********************************************************************
Your current.txt is older than your current changes in library classes.
Did you forget to re-run ./gradlew updateApi?
**********************************************************************{}
""".format(WARNING_COLOR, END_COLOR)


def main(args=None):
  if not ('ENABLE_UPDATEAPI_WARNING' in os.environ):
    sys.exit(0)

  parser = argparse.ArgumentParser()
  parser.add_argument('--file', '-f', nargs='*')
  parser.set_defaults(format=False)
  args = parser.parse_args()
  api_files = [f for f in args.file
               if f.endswith('.txt') and '/api/' in f]
  source_files = [f for f in args.file
               if (not "buildSrc/" in f and
                  "/src/main/" in f or
                  "/src/commonMain/" in f or
                  "/src/androidMain/" in f)]
  if len(source_files) == 0:
    sys.exit(0)

  if len(api_files) == 0:
    print(WARNING_NO_API_FILES)
    sys.exit(77) # 77 is a warning code in repohooks

  last_source_timestamp = max([os.path.getmtime(f) for f in source_files])
  last_api_timestamp = max([os.path.getmtime(f) for f in api_files])

  if last_source_timestamp > last_api_timestamp:
    print(WARNING_OLD_API_FILES)
    sys.exit(77) # 77 is a warning code in repohooks
  sys.exit(0)

if __name__ == '__main__':
  main()
