#!/bin/bash

# For each {module}/pom.xml
# Removes dependencyManagement and pluginManagement that should be handled in the parent
# Also removes other configuration that is handled in google-cloud-pom-parent and google-cloud-jar-parent

set -e

function runRegexOnPoms {
  perl_command=$1
  search=$2
  for pomFile in $(find . -mindepth 2 -maxdepth 3 -name pom.xml |sort --dictionary-order); do
    if [[ $pomFile =~ .*google-cloud-jar-parent.* ]] || \
       [[ $pomFile =~ .*google-cloud-pom-parent.* ]] || \
       [[ $pomFile =~ .*java-shared-dependencies.* ]]; then
      continue
    fi

    if grep -q "${search}" "$pomFile" && [[ $(wc -c < "$pomFile") !=  $(perl -0pe "$perl_command" "$pomFile" | wc -c) ]]; then
      # execute the replacement in pom.xml
      echo "Applying $perl_command for $pomFile"
      perl -i -0pe "$perl_command" "$pomFile"
    fi

  done
}

function removeArtifact {
  type=$1
  name=$2
  parent=$3
  perl_command="s/(<${parent}>.*?)\s*<${type}>\s*?<groupId>[a-z\-\.]*<\/groupId>\s*?<artifactId>${name//-/\-}<\/artifactId>.*?<\/${type}>(.*?<\/${parent}>)/\$1\$2/s"
  runRegexOnPoms "$perl_command" "$name"
}

function removeArtifactVersion {
  type=$1
  name=$2
  perl_command="s/(\s*<${type}>\s*?<groupId>[a-z\-\.]*<\/groupId>\s*?<artifactId>${name//-/\-}<\/artifactId>\s*?(<scope>.*?<\/scope>)?)\s*?<version>[^\\n]*?<\/version>(.*?<\/${type}>)/\$1\$3/s"
  runRegexOnPoms "$perl_command" "$name"
}

function annotateArtifactVersion {
  type=$1
  name=$2
  perl_command="s/(\s*<${type}>\s*?<groupId>[a-z\-\.]*<\/groupId>\s*?<artifactId>${name//-/\-}<\/artifactId>\s*?(<scope>.*?<\/scope>)?\s*?)(<version>[^\\n]*?<\/version>)([^:\\n]*\\n.*?<\/${type}>)/\$1\$3<!-- {x-version-update:${name//-/\-}:current} -->\$4/s"
  runRegexOnPoms "$perl_command" "$name"
}

function removeManagedDependency {
  dependency=$1
  removeArtifact 'dependency' "${dependency}" "dependencyManagement"
}

function removeElement {
  element=$1
  perl_command="s/\s*<${element}>.*?<\/${element}>//s"
  runRegexOnPoms "$perl_command" "<${element}>"
}

function setGrafeasCheckstyleHeaderConfig {
  perl_command="s/(\s*<properties>\s*.*?)(\s*<checkstyle.header.file>grafeas.header<\/checkstyle.header.file>)?(\s*<\/properties>)/\$1\n    <checkstyle.header.file>grafeas.header<\/checkstyle.header.file>\$3/s"
  runRegexOnPoms "$perl_command" ">Grafeas Client<"
}

setGrafeasCheckstyleHeaderConfig
removeManagedDependency 'google-cloud-shared-dependencies'
removeManagedDependency 'junit'
removeManagedDependency 'joda-time'
removeManagedDependency 'truth'
removeManagedDependency 'easymock'
removeManagedDependency 'perfmark-api'
removeManagedDependency 'google-cloud-pubsub'
removeManagedDependency 'proto-google-cloud-pubsub-v1'
removeManagedDependency 'google-cloud-pubsub-bom'
removeManagedDependency 'google-api-services-translate'
removeElement 'reporting'
removeElement 'developers'
removeElement 'organization'
removeElement 'scm'
removeElement 'issueManagement'
removeElement 'licenses'
removeElement 'profiles'
removeElement 'junit.version'
removeElement 'build'
removeElement 'url'
removeArtifact 'plugin' 'nexus-staging-maven-plugin' 'plugins'
removeArtifact 'dependency' 'checkstyle' 'plugins'
removeArtifactVersion 'dependency' 'junit'
removeArtifactVersion 'dependency' 'easymock'
removeArtifactVersion 'dependency' 'truth'
removeArtifactVersion 'dependency' 'grpc-google-common-protos'
removeArtifactVersion 'dependency' 'google-api-services-dns'
removeArtifactVersion 'dependency' 'google-api-services-translate'
removeArtifactVersion 'dependency' 'google-api-services-cloudresourcemanager'
removeArtifactVersion 'dependency' 'google-api-services-storage'
removeArtifactVersion 'dependency' 'google-cloud-storage'
removeArtifactVersion 'plugin' 'maven-checkstyle-plugin'
removeArtifactVersion 'dependency' 'mockito-all'
removeArtifactVersion 'dependency' 'objenesis'
annotateArtifactVersion 'dependency' 'grafeas'
annotateArtifactVersion 'dependency' 'proto-google-cloud-orgpolicy-v1'
annotateArtifactVersion 'dependency' 'proto-google-identity-accesscontextmanager-v1'
annotateArtifactVersion 'dependency' 'proto-google-cloud-os-config-v1'
annotateArtifactVersion 'dependency' 'google-cloud-resourcemanager'