#!/usr/bin/env bash

# Prowler - the handy cloud security tool (copyright 2018) by Toni de la Fuente
#
# Licensed under the Apache License, Version 2.0 (the "License"); you may not
# use this file except in compliance with the License. You may obtain a copy
# of the License at http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software distributed
# under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR
# CONDITIONS OF ANY KIND, either express or implied. See the License for the
# specific language governing permissions and limitations under the License.

# Output formatting functions
textPass(){
  if [[ "$QUIET" == 1 ]]; then
    return
  fi

  PASS_COUNTER=$((PASS_COUNTER+1))
  if [[ "$MODE" == "csv" ]]; then
    if [[ $2 ]]; then
      REPREGION=$2
    else
      REPREGION=$REGION
    fi
    echo "$PROFILE${SEP}$ACCOUNT_NUM${SEP}$REPREGION${SEP}$TITLE_ID${SEP}PASS${SEP}$ITEM_SCORED${SEP}$ITEM_LEVEL${SEP}$TITLE_TEXT${SEP}$1"
  elif [[ "$MODE" == "json" ]]; then
    if [[ $2 ]]; then
      REPREGION=$2
    else
      REPREGION=$REGION
    fi
    jq -M -c \
    --arg PROFILE "$PROFILE" \
    --arg ACCOUNT_NUM "$ACCOUNT_NUM" \
    --arg TITLE_TEXT "$TITLE_TEXT" \
    --arg MESSAGE "$(echo -e "${1}" | sed -e 's/^[[:space:]]*//')" \
    --arg SCORED "$ITEM_SCORED" \
    --arg ITEM_LEVEL "$ITEM_LEVEL" \
    --arg TITLE_ID "$TITLE_ID" \
    --arg REPREGION "$REPREGION" \
    --arg TIMESTAMP $(date -u +"%Y-%m-%dT%H:%M:%SZ") \
    -n '{
      "Profile": $PROFILE,
      "Account Number": $ACCOUNT_NUM,
      "Control": $TITLE_TEXT,
      "Message": $MESSAGE,
      "Status": "Pass",
      "Scored": $SCORED,
      "Level": $ITEM_LEVEL,
      "Control ID": $TITLE_ID,
      "Region": $REPREGION,
      "Timestamp": $TIMESTAMP,
    }'
  else
    echo "      $OK PASS!$NORMAL $1"
  fi
}

textInfo(){
  if [[ "$QUIET" == 1 ]]; then
    return
  fi

  if [[ "$MODE" == "csv" ]]; then
    if [[ $2 ]]; then
      REPREGION=$2
    else
      REPREGION=$REGION
    fi
    echo "$PROFILE${SEP}$ACCOUNT_NUM${SEP}$REPREGION${SEP}$TITLE_ID${SEP}INFO${SEP}$ITEM_SCORED${SEP}$ITEM_LEVEL${SEP}$TITLE_TEXT${SEP}$1"
  elif [[ "$MODE" == "json" ]]; then
    if [[ $2 ]]; then
      REPREGION=$2
    else
      REPREGION=$REGION
    fi
    jq -M -c \
    --arg PROFILE "$PROFILE" \
    --arg ACCOUNT_NUM "$ACCOUNT_NUM" \
    --arg TITLE_TEXT "$TITLE_TEXT" \
    --arg MESSAGE "$(echo -e "${1}" | sed -e 's/^[[:space:]]*//')" \
    --arg SCORED "$ITEM_SCORED" \
    --arg ITEM_LEVEL "$ITEM_LEVEL" \
    --arg TITLE_ID "$TITLE_ID" \
    --arg REPREGION "$REPREGION" \
    --arg TIMESTAMP $(date -u +"%Y-%m-%dT%H:%M:%SZ") \
    -n '{
      "Profile": $PROFILE,
      "Account Number": $ACCOUNT_NUM,
      "Control": $TITLE_TEXT,
      "Message": $MESSAGE,
      "Status": "Info",
      "Scored": $SCORED,
      "Level": $ITEM_LEVEL,
      "Control ID": $TITLE_ID,
      "Region": $REPREGION,
      "Timestamp": $TIMESTAMP,
    }'
  else
    echo "      $NOTICE INFO! $1 $NORMAL"
  fi
}

textFail(){
  FAIL_COUNTER=$((FAIL_COUNTER+1))
  EXITCODE=3
  if [[ "$MODE" == "csv" ]]; then
    if [[ $2 ]]; then
      REPREGION=$2
    else
      REPREGION=$REGION
    fi
    echo "$PROFILE${SEP}$ACCOUNT_NUM${SEP}$REPREGION${SEP}$TITLE_ID${SEP}FAIL${SEP}$ITEM_SCORED${SEP}$ITEM_LEVEL${SEP}$TITLE_TEXT${SEP}$1"
  elif [[ "$MODE" == "json" ]]; then
    if [[ $2 ]]; then
      REPREGION=$2
    else
      REPREGION=$REGION
    fi
    jq -M -c \
    --arg PROFILE "$PROFILE" \
    --arg ACCOUNT_NUM "$ACCOUNT_NUM" \
    --arg TITLE_TEXT "$TITLE_TEXT" \
    --arg MESSAGE "$(echo -e "${1}" | sed -e 's/^[[:space:]]*//')" \
    --arg SCORED "$ITEM_SCORED" \
    --arg ITEM_LEVEL "$ITEM_LEVEL" \
    --arg TITLE_ID "$TITLE_ID" \
    --arg REPREGION "$REPREGION" \
    --arg TIMESTAMP $(date -u +"%Y-%m-%dT%H:%M:%SZ") \
    -n '{
      "Profile": $PROFILE,
      "Account Number": $ACCOUNT_NUM,
      "Control": $TITLE_TEXT,
      "Message": $MESSAGE,
      "Status": "Fail",
      "Scored": $SCORED,
      "Level": $ITEM_LEVEL,
      "Control ID": $TITLE_ID,
      "Region": $REPREGION,
      "Timestamp": $TIMESTAMP,
    }'
  else
    echo "      $BAD FAIL! $1 $NORMAL"
  fi
}

textTitle(){
  CHECKS_COUNTER=$((CHECKS_COUNTER+1))
  TITLE_ID=$1
  if [[ $NUMERAL ]]; then
    TITLE_ID=$(echo $TITLE_ID | cut -d, -f2)
  else
    TITLE_ID=$(echo $TITLE_ID | cut -d, -f1)
  fi

  TITLE_TEXT=$2

  case "$3" in
    0|No|NOT_SCORED)
      ITEM_SCORED="Not Scored"
      ;;
    1|Yes|SCORED)
      ITEM_SCORED="Scored"
      ;;
    *)
      ITEM_SCORED="Unspecified"
      ;;
  esac

  case "$4" in
    LEVEL1)  ITEM_LEVEL="Level 1";;
    LEVEL2)  ITEM_LEVEL="Level 2";;
    EXTRA)   ITEM_LEVEL="Extra";;
    SUPPORT) ITEM_LEVEL="Support";;
    *)       ITEM_LEVEL="Unspecified or Invalid";;
  esac

  if [[ "$MODE" == "csv" ]]; then
      >&2 echo "$TITLE_ID $TITLE_TEXT"
  elif [[ "$MODE" == "json" ]]; then
    :
  else
    if [[ "$ITEM_SCORED" == "Scored" ]]; then
      echo -e "\n$BLUE $TITLE_ID $NORMAL $TITLE_TEXT"
    else
      echo -e "\n$PURPLE $TITLE_ID $TITLE_TEXT $NORMAL"
    fi
  fi
}
