#!/usr/bin/env bash

# Script used to init the Portainer development environment inside the dev-toolkit image

### COLOR OUTPUT ###

ESeq="\x1b["
RCol="$ESeq"'0m'    # Text Reset

# Regular               Bold                    Underline               High Intensity          BoldHigh Intens         Background              High Intensity Backgrounds
Bla="$ESeq"'0;30m';     BBla="$ESeq"'1;30m';    UBla="$ESeq"'4;30m';    IBla="$ESeq"'0;90m';    BIBla="$ESeq"'1;90m';   On_Bla="$ESeq"'40m';    On_IBla="$ESeq"'0;100m';
Red="$ESeq"'0;31m';     BRed="$ESeq"'1;31m';    URed="$ESeq"'4;31m';    IRed="$ESeq"'0;91m';    BIRed="$ESeq"'1;91m';   On_Red="$ESeq"'41m';    On_IRed="$ESeq"'0;101m';
Gre="$ESeq"'0;32m';     BGre="$ESeq"'1;32m';    UGre="$ESeq"'4;32m';    IGre="$ESeq"'0;92m';    BIGre="$ESeq"'1;92m';   On_Gre="$ESeq"'42m';    On_IGre="$ESeq"'0;102m';
Yel="$ESeq"'0;33m';     BYel="$ESeq"'1;33m';    UYel="$ESeq"'4;33m';    IYel="$ESeq"'0;93m';    BIYel="$ESeq"'1;93m';   On_Yel="$ESeq"'43m';    On_IYel="$ESeq"'0;103m';
Blu="$ESeq"'0;34m';     BBlu="$ESeq"'1;34m';    UBlu="$ESeq"'4;34m';    IBlu="$ESeq"'0;94m';    BIBlu="$ESeq"'1;94m';   On_Blu="$ESeq"'44m';    On_IBlu="$ESeq"'0;104m';
Pur="$ESeq"'0;35m';     BPur="$ESeq"'1;35m';    UPur="$ESeq"'4;35m';    IPur="$ESeq"'0;95m';    BIPur="$ESeq"'1;95m';   On_Pur="$ESeq"'45m';    On_IPur="$ESeq"'0;105m';
Cya="$ESeq"'0;36m';     BCya="$ESeq"'1;36m';    UCya="$ESeq"'4;36m';    ICya="$ESeq"'0;96m';    BICya="$ESeq"'1;96m';   On_Cya="$ESeq"'46m';    On_ICya="$ESeq"'0;106m';
Whi="$ESeq"'0;37m';     BWhi="$ESeq"'1;37m';    UWhi="$ESeq"'4;37m';    IWhi="$ESeq"'0;97m';    BIWhi="$ESeq"'1;97m';   On_Whi="$ESeq"'47m';    On_IWhi="$ESeq"'0;107m';

printSection() {
  echo -e "${BIYel}>>>> ${BIWhi}${1}${RCol}"
}

info() {
  echo -e "${BIWhi}${1}${RCol}"
}

success() {
  echo -e "${BIGre}${1}${RCol}"
}

error() {
  echo -e "${BIRed}${1}${RCol}"
}

errorAndExit() {
  echo -e "${BIRed}${1}${RCol}"
  exit 1
}

### !COLOR OUTPUT ###

SETUP_FILE=/setup-done

display_configuration() {
  info "Portainer dev-toolkit container configuration"
  info "Go version"
  /usr/local/go/bin/go version
  info "Node version"
  node -v
  info "Pnpm version"
  pnpm -v
  info "Docker version"
  docker version
}

main() {
    [[ -z $PUSER ]] && errorAndExit "Unable to find PUSER environment variable. Please ensure PUSER is set before running this script."
    [[ -z $PUID ]] && errorAndExit "Unable to find PUID environment variable. Please ensure PUID is set before running this script."
    [[ -z $PGID ]] && errorAndExit "Unable to find PGID environment variable. Please ensure PGID is set before running this script."
    [[ -z $DOCKERGID ]] && errorAndExit "Unable to find DOCKERGID environment variable. Please ensure DOCKERGID is set before running this script."

    if [[ -f "${SETUP_FILE}" ]]; then
        info "Portainer dev-toolkit container already configured."
        display_configuration
    else
        info "Creating user group..."
        groupadd -g $PGID $PUSER

        info "Creating user..."
        useradd -l -u $PUID -g $PUSER $PUSER

        info "Setting up home..."
        install -d -m 0755 -o $PUSER -g $PUSER /home/$PUSER

        info "Configuring Docker..."
        groupadd -g $DOCKERGID docker
        usermod -aG docker $PUSER

        info "Configuring Go..."
        echo "PATH=\"$PATH:/usr/local/go/bin\"" > /etc/environment

        info "Configuring Git..."
        su $PUSER -c "git config --global url.git@github.com:.insteadOf https://github.com/"

        info "Configuring SSH..."
        mkdir /home/$PUSER/.ssh
        cp /host-ssh/* /home/$PUSER/.ssh/
        chown -R $PUSER:$PUSER /home/$PUSER/.ssh

        touch "${SETUP_FILE}"
        success "Portainer dev-toolkit container successfully configured."

        display_configuration
    fi
}

main
su $PUSER -s "$@"