#!/usr/bin/env python3
#
# Copyright 2019 The Flutter Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

import argparse
import datetime
import os
import sys
import json

THIS_DIR = os.path.abspath(os.path.dirname(__file__))

# The template for the POM file.
POM_FILE_CONTENT = '''<?xml version="1.0" encoding="UTF-8"?>
<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <modelVersion>4.0.0</modelVersion>
  <groupId>io.flutter</groupId>
  <artifactId>{0}</artifactId>
  <version>{1}</version>
  <packaging>jar</packaging>
  <dependencies>
    {2}
  </dependencies>
</project>
'''

POM_DEPENDENCY = '''
    <dependency>
      <groupId>{0}</groupId>
      <artifactId>{1}</artifactId>
      <version>{2}</version>
      <scope>compile</scope>
    </dependency>
'''

MAVEN_METADATA_CONTENT ='''
<metadata xmlns="http://maven.apache.org/METADATA/1.1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/METADATA/1.1.0 http://maven.apache.org/xsd/metadata-1.1.0.xsd" modelVersion="1.1.0">
  <groupId>io.flutter</groupId>
  <artifactId>{0}</artifactId>
  <version>{1}</version>
  <versioning>
    <versions>
      <version>{1}</version>
    </versions>
    <snapshot>
      <timestamp>{2}</timestamp>
      <buildNumber>0</buildNumber>
    </snapshot>
    <snapshotVersions>
      <snapshotVersion>
        <extension>jar</extension>
        <value>{1}</value>
      </snapshotVersion>
      <snapshotVersion>
        <extension>pom</extension>
        <value>{1}</value>
      </snapshotVersion>
    </snapshotVersions>
  </versioning>
</metadata>
'''

def utf8(s):
  return str(s, 'utf-8') if isinstance(s, (bytes, bytearray)) else s

def main():
  with open (os.path.join(THIS_DIR, 'files.json')) as f:
    dependencies = json.load(f)

  parser = argparse.ArgumentParser(description='Generate the POM file for the engine artifacts')
  parser.add_argument('--engine-artifact-id', type=utf8, required=True,
                      help='The artifact id. e.g. android_arm_release')
  parser.add_argument('--engine-version', type=utf8, required=True,
                      help='The engine commit hash')
  parser.add_argument('--destination', type=utf8, required=True,
                      help='The destination directory absolute path')
  parser.add_argument('--include-embedding-dependencies', type=bool,
                      help='Include the dependencies for the embedding')

  args = parser.parse_args()
  engine_artifact_id = args.engine_artifact_id
  engine_version = args.engine_version
  artifact_version = '1.0.0-' + engine_version
  out_file_name = '%s.pom' % engine_artifact_id

  pom_dependencies = ''
  if args.include_embedding_dependencies:
    for dependency in dependencies:
      if not dependency['provides']:
        # Don't include transitive dependencies since they aren't used by the embedding.
        continue
      group_id, artifact_id, version = dependency['maven_dependency'].split(':')
      pom_dependencies += POM_DEPENDENCY.format(group_id, artifact_id, version)

  # Write the POM file.
  with open(os.path.join(args.destination, out_file_name), 'w') as f:
    f.write(POM_FILE_CONTENT.format(engine_artifact_id, artifact_version, pom_dependencies))

  # Write the Maven metadata file.
  with open(os.path.join(args.destination, '%s.maven-metadata.xml' % engine_artifact_id), 'w') as f:
    timestamp = datetime.datetime.utcnow().strftime("%Y%m%d.%H%M%S")
    f.write(MAVEN_METADATA_CONTENT.format(engine_artifact_id, artifact_version, timestamp))

if __name__ == '__main__':
  sys.exit(main())
