#!/usr/bin/python -B

# Copyright 2017 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.

"""Downloads the latest IANA timezone data."""

import argparse
import ftplib
import os
import shutil
import subprocess
import sys

sys.path.append('%s/external/icu/tools' % os.environ.get('ANDROID_BUILD_TOP'))
import i18nutil
import tzdatautil

# Calculate the paths that are referred to by multiple functions.
android_build_top = i18nutil.GetAndroidRootOrDie()
iana_data_dir = os.path.realpath('%s/system/timezone/input_data/iana' % android_build_top)
iana_tools_dir = os.path.realpath('%s/system/timezone/input_tools/iana' % android_build_top)

def FtpRetrieveFile(ftp, filename):
  ftp.retrbinary('RETR %s' % filename, open(filename, 'wb').write)


def CheckSignature(data_filename, signature_filename):
  """Checks the signature of a file."""
  print 'Verifying signature of %s using %s...' % (data_filename, signature_filename)
  try:
    subprocess.check_call(['gpg', '--trusted-key=ED97E90E62AA7E34', '--verify',
                          signature_filename, data_filename])
  except subprocess.CalledProcessError as err:
    print 'Unable to verify signature'
    print '\n\n******'
    print 'If this fails for you, you probably need to import Paul Eggert''s public key:'
    print '  gpg --receive-keys ED97E90E62AA7E34'
    print '******\n\n'
    raise


def FindLatestRemoteTar(ftp, file_prefix):
  iana_tar_filenames = []

  for filename in ftp.nlst():
    if "/" in filename:
      print "FTP server returned bogus file name"
      sys.exit(1)

    if filename.startswith(file_prefix) and filename.endswith('.tar.gz'):
      iana_tar_filenames.append(filename)

  iana_tar_filenames.sort(reverse=True)

  if len(iana_tar_filenames) == 0:
    print 'No files found'
    sys.exit(1)

  return iana_tar_filenames[0]


def DownloadAndReplaceLocalFiles(file_prefixes, ftp, local_dir):
  output_files = []

  for file_prefix in file_prefixes:
    latest_iana_tar_filename = FindLatestRemoteTar(ftp, file_prefix)
    local_iana_tar_file = tzdatautil.GetIanaTarFile(local_dir, file_prefix)
    if local_iana_tar_file:
      local_iana_tar_filename = os.path.basename(local_iana_tar_file)
      if latest_iana_tar_filename <= local_iana_tar_filename:
        print('Latest remote file for %s is called %s and is older or the same as'
              ' current local file %s'
              % (local_dir, latest_iana_tar_filename, local_iana_tar_filename))
        continue

    print 'Found new %s* file for %s: %s' % (file_prefix, local_dir, latest_iana_tar_filename)
    i18nutil.SwitchToNewTemporaryDirectory()

    print 'Downloading file %s...' % latest_iana_tar_filename
    FtpRetrieveFile(ftp, latest_iana_tar_filename)

    signature_filename = '%s.asc' % latest_iana_tar_filename
    print 'Downloading signature %s...' % signature_filename
    FtpRetrieveFile(ftp, signature_filename)

    CheckSignature(latest_iana_tar_filename, signature_filename)

    new_local_iana_tar_file = '%s/%s' % (local_dir, latest_iana_tar_filename)
    shutil.copyfile(latest_iana_tar_filename, new_local_iana_tar_file)
    new_local_signature_file = '%s/%s' % (local_dir, signature_filename)
    shutil.copyfile(signature_filename, new_local_signature_file)

    output_files.append(new_local_iana_tar_file)
    output_files.append(new_local_signature_file)

    # Delete the existing local IANA tar file, if there is one.
    if local_iana_tar_file:
      os.remove(local_iana_tar_file)

    local_signature_file = '%s.asc' % local_iana_tar_file
    if os.path.exists(local_signature_file):
      os.remove(local_signature_file)

  return output_files

# Run from any directory after having run source/envsetup.sh / lunch
# See http://www.iana.org/time-zones/ for more about the source of this data.
def main():
  parser = argparse.ArgumentParser(description=('Update IANA files from upstream'))
  parser.add_argument('--notools', help='Skip tools files', action='store_true')
  parser.add_argument('--nodata', help='Skip data files', action='store_true')
  args = parser.parse_args()
  if args.notools and args.nodata:
    parser.error("Nothing to do")
    sys.exit(1)

  print 'Looking for new IANA files...'

  ftp = ftplib.FTP('ftp.iana.org')
  ftp.login()
  ftp.cwd('tz/releases')

  output_files = []
  if not args.notools:
    # The tools and data files are kept separate to make the updates independent.
    # This means we duplicate the tzdata20xx file (once in the tools dir, once
    # in the data dir) but the contents of the data tar appear to be needed for
    # the zic build.
    new_files = DownloadAndReplaceLocalFiles(['tzdata20', 'tzcode20'], ftp, iana_tools_dir)
    output_files += new_files
  if not args.nodata:
    new_files = DownloadAndReplaceLocalFiles(['tzdata20'], ftp, iana_data_dir)
    output_files += new_files

  if len(output_files) == 0:
    print 'No files updated'
  else:
    print 'New files:'
    for output_file in output_files:
      print '  %s' % output_file


if __name__ == '__main__':
  main()
