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 is required!'
  }

  if (!config.ecr) {
    config.ecr = "483193324480.dkr.ecr.us-east-1.amazonaws.com"
  }

  if (!config.agent) {
    config.agent = 'linux-agents'
  }

  if (!config.timeoutHours) {
    config.timeoutHours = 4
  }

  if (!config.retry) {
    config.retry = 1
  }

  pipeline {
    agent {
      label config.agent
    }

    triggers {
      cron(config.cronPattern)
    }

    options {
      disableConcurrentBuilds()
      ansiColor('xterm')
      timeout(time: config.timeoutHours, unit: 'HOURS')
      retry(config.retry)
    }

    environment {
      NOTIFICATIONS_CHANNEL = '#infra-cicd-alerts'
      DOCKER_BUILDKIT       = 1
    }

    stages {
      stage('Build') {
        steps {
          sh """cd ${config.path} && \
            make docker/login
            make docker/image/build
            """
        }
      }
      stage('Scan') {
        steps {
          sh label: 'pull image for scan', script: "cd ${config.path} && make docker/image/pull"
          prismaCloudScanImage ca: '', cert: '', dockerAddress: 'unix:///var/run/docker.sock', ignoreImageBuildTime: true, image: "${config.ecr}/${config.image}", key: '', logLevel: 'info', podmanPath: '', project: '', resultsFile: 'prisma-cloud-scan-results.json'
          prismaCloudPublish resultsFilePattern: 'prisma-cloud-scan-results.json'
        }
      }
    }
    post {
      always {
        script {
          utility.slackNotify(currentBuild.currentResult, env.NOTIFICATIONS_CHANNEL)
        }
      }
      cleanup {
        deleteDir()
      }
    }
  }
}
