#!/bin/sh
# v1.0.0
# KENT

case ${1} in
  "test:js")
    echo "List of all arg: '$*'"
    JEST_COMMAND="node --experimental-vm-modules ./node_modules/.bin/jest --logHeapUsage";
    export JEST_PROJECT=${2}
    case ${2} in
      "ut")
      eval "$JEST_COMMAND" "$3" "$4" "$5" "$6" --selectProjects units
      ;;
      "ft")
      eval "$JEST_COMMAND" "$3" "$4" "$5" "$6" --selectProjects functions --runInBand
      ;;
      "it")
      eval "$JEST_COMMAND" "$3" "$4" "$5" "$6" --selectProjects integration --runInBand
      ;;
      *)
      echo "[!]MAKE: This command must give second parameter. usage: npm run ${1} ft or ut";
      ;;
    esac
  ;;

  "test")
    echo "List of all arg: '$*'"
    JEST_COMMAND="node --no-compilation-cache --expose-gc ./node_modules/.bin/jest --logHeapUsage --watchAll=false";
    export JEST_PROJECT=${2}
    case ${2} in
      "ut")
      JEST_COMMAND="node ./node_modules/.bin/jest --logHeapUsage";
      eval "$JEST_COMMAND" "$3" "$4" "$5" "$6" --selectProjects units
      ;;
      "ft")
      eval "$JEST_COMMAND" "$3" "$4" "$5" "$6" --selectProjects functions --runInBand
      ;;
      "it")
      eval "$JEST_COMMAND" "$3" "$4" "$5" "$6" --selectProjects integration --runInBand
      ;;
      *)
      echo "[!]MAKE: This command must give second parameter. usage: npm run ${1} ft or ut";
      ;;
    esac
  ;;

  "build:image")
    export NODE_ENV="${3}";
    if test -z "${3}"
    then
      export NODE_ENV="production"
      echo "[!]MAKE: No env parameter is given so set env to [${NODE_ENV}].";
    fi
    echo "[!]MAKE: Build docker image for service [${2}] and env [${NODE_ENV}].";
    if test ! -z "${2}"
    then
      docker build . -t "${2}" --build-arg NODE_ENV="${NODE_ENV}";
      docker images "${2}";
    else
      echo "[!]MAKE: This command must give image name and tag parameter. usage: npm run ${1} 'IMAGE_NAME:TAG' {ENV_NAME}";
    fi
  ;;

  "start:env")
    if test ! -z "${3}"
    then
      export NODE_ENV="${3}";
    else
      export NODE_ENV="local";
    fi
    node "${2}";
  ;;

  "start:pm2")
    echo "[!]MAKE: Run pm2 by service [${2}] with ENV: [${3}].";
    if test ! -z "${3}"
    then
      export NODE_ENV="${3}";
    else
      export NODE_ENV="local";
    fi
    pm2 startOrRestart ecosystem.config.cjs --only "${2}-${3}";
  ;;

  "start:docker")
    echo "[!]MAKE: Run docker by image [${2}].";
    if test ! -z "${3}"
    then
      export NODE_ENV="${3}";
    else
      export NODE_ENV="local";
    fi
    pm2 startOrRestart ecosystem.config.cjs --only "${2}-${3}";
  ;;

  "db:seed:env")
    if test ! -z "${2}"
    then
      export NODE_ENV="${2}";
      if test ! -z "${3}"
      then
        echo "[!]MAKE: Run sequelize-cli with ENV: [${2}] and using seeder [${3}].";
        sequelize-cli db:seed --debug --env ${2} --seed=${3}
      else
        echo "[!]MAKE: Run sequelize-cli with ENV: [${2}] and using all seeders.";
        sequelize-cli db:seed:all --debug --env ${2}
      fi
    else
      echo "[!]MAKE: This command must give ENV parameter. usage: npm run ${1} 'ENV_NAME'";
    fi
  ;;

  "db:seed:env:undo")
    if test ! -z "${2}"
    then
      export NODE_ENV="${2}";
      if test ! -z "${3}"
      then
        echo "[!]MAKE: Run sequelize-cli with ENV: [${2}] and undo seeder [${3}].";
        sequelize-cli db:seed:undo --debug --env "${2}" --seed="${3}"
      else
        echo "[!]MAKE: Run sequelize-cli with ENV: [${2}] and undo all seeders.";
        sequelize-cli db:seed:undo:all --debug --env "${2}"
      fi
    else
      echo "[!]MAKE: This command must give ENV parameter. usage: npm run ${1} 'ENV_NAME'";
    fi
  ;;

  "db:migrate:env")
    if test ! -z "${2}"
    then
      export NODE_ENV="${2}";
      if test ! -z "${3}"
      then
        echo "[!]MAKE: Run sequelize-cli with ENV: [${2}] and using migration [${3}].";
        sequelize-cli db:migrate --debug --env "${2}" --name="${3}"
      else
        echo "[!]MAKE: Run sequelize-cli with ENV: [${2}] and using all migrations.";
        sequelize-cli db:migrate --debug --env "${2}"
      fi
    else
      echo "[!]MAKE: This command must give ENV parameter. usage: ${0} ${1} 'ENV_NAME'";
    fi
  ;;

  "db:migrate:env:status")
    if test ! -z "${2}"
    then
      export NODE_ENV="${2}";
      sequelize-cli db:migrate:status --debug --env "${2}";
    else
      echo "[!]MAKE: This command must give ENV parameter. usage: ${0} ${1} 'ENV_NAME'";
    fi
  ;;

  "db:migrate:env:undo")
    if test ! -z "${2}"
    then
      export NODE_ENV="${2}";
      if test ! -z "${3}"
      then
        echo "[!]MAKE: Run sequelize-cli with ENV: [${2}] and undo migration [${3}].";
        sequelize-cli db:migrate:undo --debug --env "${2}" --name="${3}"
      else
        echo "[!]MAKE: Run sequelize-cli with ENV: [${2}] and undo the last migration.";
        sequelize-cli db:migrate:undo --debug --env "${2}"
      fi
    else
      echo "[!]MAKE: This command must give ENV parameter. usage: ${0} ${1} 'ENV_NAME'";
    fi
  ;;

  "db:migrate:env:undo:all")
    if test ! -z "${2}"
    then
      export NODE_ENV="${2}";
      echo "[!]MAKE: Run sequelize-cli with ENV: [${2}] and undo all migrations.";
      sequelize-cli db:migrate:undo:all --debug --env "${2}"
    else
      echo "[!]MAKE: This command must give ENV parameter. usage: ${0} ${1} 'ENV_NAME'";
    fi
  ;;
esac
