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

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...'
  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

# Run with no arguments from any directory, with no special setup required.
# See http://www.iana.org/time-zones/ for more about the source of this data.
def main():
  print 'Looking for new IANA tzdata...'

  iana_tar_filenames = []

  ftp = ftplib.FTP('ftp.iana.org')
  ftp.login()
  ftp.cwd('tz/releases')
  for filename in ftp.nlst():
    if "/" in filename:
      print "FTP server returned bogus file name"
      sys.exit(1)

    if filename.startswith('tzdata20') and filename.endswith('.tar.gz'):
      iana_tar_filenames.append(filename)
  iana_tar_filenames.sort(reverse=True)

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

  latest_iana_tar_filename = iana_tar_filenames[0]

  local_iana_tar_file = tzdatautil.GetIanaTarFile(iana_data_dir, 'data')

  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 'Available data %s is older or the same as current data %s' % (latest_iana_tar_filename, local_iana_tar_filename)
      sys.exit(0)

  print 'Found new tzdata: %s' % latest_iana_tar_filename
  i18nutil.SwitchToNewTemporaryDirectory()

  print 'Downloading data (%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' % (iana_data_dir, latest_iana_tar_filename)
  shutil.copyfile(latest_iana_tar_filename, new_local_iana_tar_file)
  new_local_signature_file = '%s/%s' % (iana_data_dir, signature_filename)
  shutil.copyfile(signature_filename, 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)

  print 'Look in %s for new IANA data files' % new_local_iana_tar_file
  sys.exit(0)


if __name__ == '__main__':
  main()
