#!/usr/bin/env bash

################################################################################
############# Cleanup Image on DockerHub @admiralawkbar ########################
################################################################################

# NOTES: This script is used to remove a tagged image on DockerHub
# Its based on being built from a GitHub Action, but could be easily updated
# To be ran in a different medium.
#
# PRE-Requirements:
# - Dockerfile
# - System with Docker installed
# - Global variables met

###########
# Globals #
###########
GITHUB_WORKSPACE="${GITHUB_WORKSPACE}" # GitHub Workspace
DOCKER_USERNAME="${DOCKER_USERNAME}"   # Username to login to DockerHub
DOCKER_PASSWORD="${DOCKER_PASSWORD}"   # Password to login to DockerHub
IMAGE_REPO="${IMAGE_REPO}"             # Image repo to upload the image
IMAGE_VERSION="${IMAGE_VERSION}"       # Version to tag the image
DOCKERFILE_PATH="${DOCKERFILE_PATH}"   # Path to the Dockerfile to be uploaded

################################################################################
############################ FUNCTIONS BELOW ###################################
################################################################################
################################################################################
#### Function Header ###########################################################
Header() {
  echo ""
  echo "-------------------------------------------------------"
  echo "----- GitHub Actions remove image from DockerHub ------"
  echo "-------------------------------------------------------"
  echo ""
}
################################################################################
#### Function ValidateInput ####################################################
ValidateInput() {
  # Need to validate we have the basic variables
  ################
  # Print header #
  ################
  echo ""
  echo "----------------------------------------------"
  echo "Gathering variables..."
  echo "----------------------------------------------"
  echo ""

  ############################
  # Validate GITHUB_WORKSPACE #
  ############################
  if [ -z "${GITHUB_WORKSPACE}" ]; then
    echo -e "${NC}${B[R]}${F[W]}ERROR!${NC} Failed to get [GITHUB_WORKSPACE]!${NC}"
    echo -e "${NC}${B[R]}${F[W]}ERROR:${NC}[${GITHUB_WORKSPACE}]${NC}"
    exit 1
  else
    echo "Successfully found:[GITHUB_WORKSPACE], value:[${GITHUB_WORKSPACE}]"
  fi

  #######################
  # Validate IMAGE_REPO #
  #######################
  if [ -z "${IMAGE_REPO}" ]; then
    # No repo was pulled
    echo -e "${NC}${B[R]}${F[W]}ERROR!${NC} Failed to get [IMAGE_REPO]!${NC}"
    echo -e "${NC}${B[R]}${F[W]}ERROR:${NC}[${IMAGE_REPO}]${NC}"
    exit 1
  elif [[ ${IMAGE_REPO} == "github/super-linter" ]]; then
    # Found our main repo
    echo "Successfully found:[IMAGE_REPO], value:[${IMAGE_REPO}]"
  else
    # This is a fork and we cant pull vars or any info
    echo -e "${NC}${F[Y]}WARN!${NC} No image to cleanup as this is a forked branch, and not being built with current automation!${NC}"
    exit 0
  fi

  ##########################
  # Validate IMAGE_VERSION #
  ##########################
  if [ -z "${IMAGE_VERSION}" ]; then
    echo -e "${NC}${B[R]}${F[W]}ERROR!${NC} Failed to get [IMAGE_VERSION]!${NC}"
    echo -e "${NC}${B[R]}${F[W]}ERROR:${NC}[${IMAGE_VERSION}]${NC}"
    exit 1
  else
    echo "Successfully found:[IMAGE_VERSION], value:[${IMAGE_VERSION}]"
  fi

  ############################
  # Validate DOCKER_USERNAME #
  ############################
  if [ -z "${DOCKER_USERNAME}" ]; then
    echo -e "${NC}${B[R]}${F[W]}ERROR!${NC} Failed to get [DOCKER_USERNAME]!${NC}"
    echo -e "${NC}${B[R]}${F[W]}ERROR:${NC}[${DOCKER_USERNAME}]${NC}"
    exit 1
  else
    echo "Successfully found:[DOCKER_USERNAME], value:[${DOCKER_USERNAME}]"
  fi

  ############################
  # Validate DOCKER_PASSWORD #
  ############################
  if [ -z "${DOCKER_PASSWORD}" ]; then
    echo -e "${NC}${B[R]}${F[W]}ERROR!${NC} Failed to get [DOCKER_PASSWORD]!${NC}"
    echo -e "${NC}${B[R]}${F[W]}ERROR:${NC}[${DOCKER_PASSWORD}]${NC}"
    exit 1
  else
    echo "Successfully found:[DOCKER_PASSWORD], value:[********]"
  fi

  ##################################################
  # Check if we need to get the name of the branch #
  ##################################################
  if [[ ${IMAGE_VERSION} != "latest" ]]; then
    ##################################
    # Remove non alpha-numeric chars #
    ##################################
    IMAGE_VERSION=$(echo "${IMAGE_VERSION}" | tr -cd '[:alnum:]')
  else
    #############################################
    # Image is 'latest' and we will not destroy #
    #############################################
    echo "Image Tag is set to:[latest]..."
    echo "We will never destroy latest..."
    echo "Bye!"
    exit 1
  fi
}
################################################################################
#### Function LoginToDocker ####################################################
LoginToDocker() {
  ################
  # Print header #
  ################
  echo ""
  echo "----------------------------------------------"
  echo "Login to DockerHub..."
  echo "----------------------------------------------"
  echo ""

  ######################
  # Login to DockerHub #
  ######################
  LOGIN_CMD=$(docker login --username "${DOCKER_USERNAME}" --password "${DOCKER_PASSWORD}" 2>&1)

  #######################
  # Load the error code #
  #######################
  ERROR_CODE=$?

  ##############################
  # Check the shell for errors #
  ##############################
  if [ ${ERROR_CODE} -ne 0 ]; then
    # ERROR
    echo -e "${NC}${B[R]}${F[W]}ERROR!${NC} Failed to authenticate to DockerHub!${NC}"
    echo -e "${NC}${B[R]}${F[W]}ERROR:${NC}[${LOGIN_CMD}]${NC}"
    exit 1
  else
    # SUCCESS
    echo "Successfully authenticated to DockerHub!"
  fi
}
################################################################################
#### Function RemoveImage ######################################################
RemoveImage() {
  ################
  # Print header #
  ################
  echo ""
  echo "----------------------------------------------"
  echo "Removing the DockerFile image:[${IMAGE_REPO}:${IMAGE_VERSION}]"
  echo "----------------------------------------------"
  echo ""

  #####################################
  # Create Token to auth to DockerHub #
  #####################################
  TOKEN=$(curl -s -k \
    -H "Content-Type: application/json" \
    -X POST \
    -d "{\"username\": \"${DOCKER_USERNAME}\", \"password\": \"${DOCKER_PASSWORD}\"}" \
    "https://hub.docker.com/v2/users/login/" | jq -r .token 2>&1)

  #######################
  # Load the ERROR_CODE #
  #######################
  ERROR_CODE=$?

  ##############################
  # Check the shell for errors #
  ##############################
  if [ ${ERROR_CODE} -ne 0 ]; then
    # ERROR
    echo -e "${NC}${B[R]}${F[W]}ERROR!${NC} Failed to gain token from DockerHub!${NC}"
    echo -e "${NC}${B[R]}${F[W]}ERROR:${NC}[${TOKEN}]${NC}"
    exit 1
  else
    # SUCCESS
    echo "Successfully gained auth token from DockerHub!"
  fi

  #################################
  # Remove the tag from DockerHub #
  #################################
  REMOVE_CMD=$(curl "https://hub.docker.com/v2/repositories/${IMAGE_REPO}/tags/${IMAGE_VERSION}/" \
    -X DELETE \
    -H "Authorization: JWT ${TOKEN}" 2>&1)

  #######################
  # Load the ERROR_CODE #
  #######################
  ERROR_CODE=$?

  ##############################
  # Check the shell for errors #
  ##############################
  if [ ${ERROR_CODE} -ne 0 ]; then
    # ERROR
    echo -e "${NC}${B[R]}${F[W]}ERROR!${NC} Failed to remove tag from DockerHub!${NC}"
    echo -e "${NC}${B[R]}${F[W]}ERROR:${NC}[${REMOVE_CMD}]${NC}"
    exit 1
  else
    # SUCCESS
    echo "Successfully [removed] Docker image tag:[${IMAGE_VERSION}] from DockerHub!"
  fi
}
################################################################################
#### Function Footer ###########################################################
Footer() {
  echo ""
  echo "-------------------------------------------------------"
  echo "The step has completed"
  echo "-------------------------------------------------------"
  echo ""
}
################################################################################
################################## MAIN ########################################
################################################################################

##########
# Header #
##########
Header

##################
# Validate Input #
##################
ValidateInput

######################
# Login to DockerHub #
######################
LoginToDocker

####################
# Remove the image #
####################
RemoveImage

##########
# Footer #
##########
Footer