# BUILDING SupportLeanbackShowcase app using local library.
import sys
import subprocess
import os
import fileinput
import re

# Does an inplace substitution of the pattern with newVal in inputFile
def replace(inputFile, pattern, newVal, ):
  print 'About to replace repo path to {0} in {1}'.format(newVal, inputFile)
  replaced = False
  try:
    for line in fileinput.input(inputFile, inplace = 1):
      if re.match(pattern, line, re.I|re.M):
        line = re.sub(pattern, newVal, line)
        replaced = True
      print line,
  except IOError as e:
    print "Failed to open file ", e

  if not replaced:
    file = open(inputFile, "a")
    file.write(newVal + "\n")

# Finds the local leanback library version based on leanback-v17/maven-metadata.xml
def lookup_local_library_version(repo_path):
  leanback_maven_metadata_path = repo_path + "/out/host/gradle/frameworks/support/build/support_repo/com/android/support/leanback-v17/maven-metadata.xml"
  if not os.path.exists(leanback_maven_metadata_path):
    print "ERROR: Missing leanback-v17 library {} in local repo".format(leanback_maven_metadata_path)

  file = open(leanback_maven_metadata_path, "r")
  for line in file:
    matchObj = re.match(r'\s*<version>(.*)</version>', line)
    if matchObj:
      return matchObj.group(1).strip(' \t\n\r')

# Get repo path
current_path = os.getcwd()
index = current_path.find("development/samples/SupportLeanbackShowcase")
if index < 0:
  print "ERROR: Invalid repo {0}".format(current_path)
  exit(0)

repo_path = current_path[:index]
support_frameworks_path = repo_path + "/frameworks/support"
if not (os.path.isdir(repo_path) or os.path.isdir(support_frameworks_path)):
  print 'ERROR : Repo "{0}" does not exist'.format(repo_path)
  print 'Please run gradlew uploadArchives inside frameworks/support'
  exit(0)

# Substitute LIBRARY_VERSION/LOCAL_REPO in local.properties
library_version = lookup_local_library_version(repo_path)
replace(os.getcwd()+"/local.properties", r'(.*)LOCAL_REPO(.*)', 'LOCAL_REPO='+repo_path)
replace(os.getcwd()+"/local.properties", r'(.*)LIBRARY_VERSION(.*)', 'LIBRARY_VERSION='+library_version)

# Build
print "Building SupportLeanbackShowcase app..."
subprocess.call(["./gradlew", "assembleDebug"])

#Install apk
print "Installing SupportLeanbackShowcase..."
subprocess.call(["adb", "install", "-r", "./app/build/outputs/apk/app-debug.apk"])

print "Finished installing SupportLeanbackShowcase app."

