def call(body) {
  def config = [:]
  body.resolveStrategy = Closure.DELEGATE_FIRST
  body.delegate = config
  body()

  if (!config.cronPattern) {
    error 'cron pattern is required!'
  }

  if (!config.image) {
    error 'image name is required!'
  }

  if (!config.tags || config.tags.size() == 0) {
    error 'please provide at least 1 tag!'
  }

  if (!config.source_registry) {
    config.source_registry = 'docker.io/library'
  }

  pipeline {
    agent {
      label 'linux-agents'
    }

    triggers {
      pollSCM ignorePostCommitHooks: true, scmpoll_spec: ''
      cron(config.cronPattern)
    }

    options {
      buildDiscarder logRotator(artifactDaysToKeepStr: '', artifactNumToKeepStr: '', daysToKeepStr: '', numToKeepStr: '5')
      disableResume()
      disableConcurrentBuilds()
    }

    environment {
      AWS_ACCOUNT    = '483193324480'
      AWS_REGION     = 'us-east-1'
      AWS_PROFILE    = 'gdb-infra-dev'
      DOCKER_HUB_URL = "${config.source_registry}/${config.image}"
      BASE_ECR_URL   = "${AWS_ACCOUNT}.dkr.ecr.${AWS_REGION}.amazonaws.com"
      ECR_URL        = "${AWS_ACCOUNT}.dkr.ecr.${AWS_REGION}.amazonaws.com/${config.image}"
      TAGS           = "${config.tags.join(',')}"
    }

    stages {
      stage('ECR login') {
        steps {
          sh """
            echo "Logging to registry"
            aws ecr get-login \
              --profile ${AWS_PROFILE} \
              --no-include-email \
              --region ${AWS_REGION} | awk '{print \$6}' | \
              docker login -u AWS --password-stdin https://${BASE_ECR_URL} || aws ecr get-login-password \
                --profile ${AWS_PROFILE} \
                --region ${AWS_REGION} | \
                docker login --username AWS --password-stdin https://${BASE_ECR_URL}
          """
        }
      }
      stage('PullAndPush') {
        steps {
          script {
            env.TAGS.split(',').each { tag ->
              stage("Pull ${tag}") {
                sh "docker pull ${env.DOCKER_HUB_URL}:${tag}"
              }

              stage("Tag ${tag}") {
                sh "docker tag ${env.DOCKER_HUB_URL}:${tag} ${env.ECR_URL}:${tag}"
              }

              stage("Push ${tag}") {
                sh "docker push ${env.ECR_URL}:${tag}"
              }
            }
          }
        }
      } /** end: stage */
    } /** end: stages */
    post {
      cleanup {
        deleteDir()
      }
    }
  }
}
