#!/bin/bash

set -eu

source ./utils/common.sh

WORKDIR=/home/oscarzhou/source/github.com/portainer
GLOBAL_VOLUME=/home/oscarzhou/volumes
TRUE=0;
FALSE=1;

# PORTAINER_FLAGS=
# PORTAINER_FLAGS=--enable-init true

function choose_repo() {
    read -p "Choose the working project EE/(CE)/(k8s)/(agent):" REPO

    if [ -z "$REPO" ]; then 
        REPO="EE";
    fi 

    if [[ "${REPO}" == "ee" || "${REPO}" == "EE" ]]; then 
        cd ${WORKDIR}/portainer-ee

    elif [[ "${REPO}" == "ce" || "${REPO}" == "CE" ]]; then 
        cd ${WORKDIR}/portainer

    elif [[ "${REPO}" == "k8s" || "${REPO}" == "ks" ]]; then 
        cd ${WORKDIR}/k8s

    elif [[ "${REPO}" == "ag" || "${REPO}" == "agent" ]]; then 
        cd ${WORKDIR}/agent
    fi
}

function is_root() {
    if [ "$EUID" -ne 0 ]; then 
        printf "${HIGHLIGHT_COLOR}Please run as root${NO_COLOR}\n"
        exit;
    fi
}

function check_branch() {
    printf "Your current checkout branch \n$(git branch)\n"
    read -p "Continue N/(Y)?" CORRECT_BRANCH
    if [ -z "$CORRECT_BRANCH" ]; then 
        CORRECT_BRANCH="N";
    fi 

    if [[ "${CORRECT_BRANCH}" == "N" || "${CORRECT_BRANCH}" == "n" ]]; then 
        printf "${ERROR_COLOR}Exit.\n";
        return $FALSE;
    fi
    return $TRUE;
}

function choose_export_volume() {
    read -p "Choose the volume EE/CE/Temp-data(TD):" DEST

    if [ -z "$DEST" ]; then 
        DEST="EE";
    fi 

    if [[ "${DEST}" == "ee" || "${DEST}" == "EE" ]]; then 
        VOLUME=~/volumes/portainer-ee-data

    elif [[ "${DEST}" == "ce" || "${DEST}" == "CE" ]]; then 
        VOLUME=~/volumes/portainer-ce-data

    elif [[ "${DEST}" == "td" || "${DEST}" == "TD" ]]; then 
        VOLUME=~/volumes/temp-data

    fi

    export PORTAINER_DATA=${VOLUME}
    printf "${HIGHLIGHT_COLOR}export PORTAINER_DATA=${PORTAINER_DATA}${NO_COLOR}\n"
}

function cleanup_temporary_volume() {
    printf "${HIGHLIGHT_COLOR}Clean temporary data${NO_COLOR}\n"

    local VOLUME=~/volumes/temp-data
    if [ -d ${VOLUME} ]; then 
        printf "The current volume is ${VOLUME}. "
        read -p "Do you want to clean up the existing data N/(Y)?" CLEAN_DATA
        if [[ "${CLEAN_DATA}" == "y" || "${CLEAN_DATA}" == "Y" ]]; then 
            rm -rvf ${VOLUME}/*
        fi 
    else 
        mkdir ${VOLUME}
    fi 
}

function build_portainer_frontend_without_prompt() {
    printf "${HIGHLIGHT_COLOR}Build Portainer Frontend${NO_COLOR}\n"

    yarn 
    yarn start:client
}

function build_portainer_backend_without_prompt() {
    printf "${HIGHLIGHT_COLOR}Build Portainer Backend${NO_COLOR}\n"

    if [ -z dist/portainer ]; then 
        rm dist/portainer;
    fi

    yarn start:server
}

function build_portainer_frontend() {
    choose_repo

    if ! check_branch; then 
        exit;
    fi

    build_portainer_frontend_without_prompt

}

function build_portainer_backend() {
    choose_repo 

    choose_export_volume

    if ! check_branch; then 
        exit;
    fi

    build_portainer_backend_without_prompt
}

function build_portainer_agent() {
    choose_repo 

    if ! check_branch; then 
        exit;
    fi

    ./dev.sh compile
}

function build_portainer_all() {
    printf "${HIGHLIGHT_COLOR}Build Portainer all${NO_COLOR}\n"

    choose_repo 

    choose_export_volume

    if ! check_branch; then 
        exit;
    fi

    build_portainer_backend_without_prompt

    build_portainer_frontend_without_prompt
}

function run_before_commit() {
    printf "${HIGHLIGHT_COLOR}Run before commit${NO_COLOR}\n"

    choose_repo 

    if ! check_branch; then 
        exit;
    fi

    input "1. Only frontend 2. Only backend 3. Both" option

    if [ option == "1" ]; then
        print_highlight "yarn test";
        yarn test:client

        print_highlight "yarn format";
        yarn format:client

        print_highlight "yarn lint"
        yarn lint:client
    elif [ option == "2" ]; then 
        print_highlight "yarn test";
        yarn test:server

        print_highlight "yarn format";
        yarn format:server

        print_highlight "yarn lint"
        yarn lint:server

    elif [ option == "3" ]; then 
        print_highlight "yarn test";
        yarn test

        print_highlight "yarn format";
        yarn format

        print_highlight "yarn lint"
        yarn lint
    else 
        print_highlight "yarn test";
        yarn test:client

        print_highlight "yarn format";
        yarn format:client

        print_highlight "yarn lint"
        yarn lint:client
    fi
}


function run_before_commit_k8s() {
    printf "${HIGHLIGHT_COLOR}Run before commit${NO_COLOR}\n"

    choose_repo 

    if ! check_branch; then 
        exit;
    fi

    printf "${HIGHLIGHT_COLOR}chart-testing ct lint${NO_COLOR}\n"

    docker run --rm -it -w /repo -v `pwd`:/repo quay.io/helmpack/chart-testing ct lint --all --config=.ci/ct-config.yaml 
}

function generate_portainer_jwt() {
    printf "${HIGHLIGHT_COLOR}Generate Portainter JWT${NO_COLOR}\n"

    read -p "Username(admin):" username
    if [ -z "$username" ]; then 
        username="admin";
    fi 

    read -p "Password(****):" password
    read -p "Address(127.0.0.1):" address
    if [ -z "$address" ]; then 
        address="127.0.0.1";
    fi 

    payload="{\"username\":\"${username}\",\"password\":\"${password}\"}"
    curl -d ${payload} -H 'Content-Type: application/json' "http://${address}:9000/api/auth"
}

function get_portainer_ce_api_reference() {
    printf "${HIGHLIGHT_COLOR}Get the reference of Portainer CE API${NO_COLOR}\n"

    cd ${WORKDIR}/portainer

    if ! check_branch; then
        exit;
    fi

    read -p "Commit(HEAD):" commit
    if [ -z "$commit" ]; then
        commit=$(git rev-parse HEAD)
    fi
    printf "${HIGHLIGHT_COLOR}Installing github.com/portainer/portainer/api@${commit}${NO_COLOR}\n"
    
    output=$(go install github.com/portainer/portainer/api@${commit}) | while IFS= read -r line; do
        echo "$line"
    done

    # result="
    # go: downloading github.com/portainer/portainer/api v0.0.0-20220622202437-f0ca3e63db9d
    # go: downloading github.com/portainer/portainer v0.6.1-0.20220622202437-f0ca3e63db9d
    # package github.com/portainer/portainer/api is not a main package
    # "

    # while IFS= read -r line; do
    #     echo "$line"
    # done <<< $(echo ${result})
}

function menu() {
    PS3='Please select the option: '
    OPTIONS=(
        'Build Portainer EE/CE All'
        'Build Portainer EE/CE Frontend'
        'Build Portainer EE/CE Backend'
        'Generate Portainer EE/CE JWT'
        'Run Before Commit [Portainer EE/CE]'
        'Get Portainer CE API Reference'
        'Run Before Commit [k8s]'
        'Build Portainer Agent'
        'Cleanup Temporary Volume'
        'Quit'
    )

    select opt in "${OPTIONS[@]}"
    do
        case $opt in 
            'Build Portainer EE/CE All')
                build_portainer_all
                ;;
            'Build Portainer EE/CE Frontend')
                build_portainer_frontend
                ;;
            'Build Portainer EE/CE Backend')
                build_portainer_backend
                ;;
            'Generate Portainer EE/CE JWT')
                generate_portainer_jwt
                ;;
            'Run Before Commit [Portainer EE/CE]')
                run_before_commit
                ;;
            'Get Portainer CE API Reference')
                get_portainer_ce_api_reference
                ;;
            'Run Before Commit [k8s]')
                run_before_commit_k8s
                ;;
            'Build Portainer Agent')
                build_portainer_agent
                ;;
            'Cleanup Temporary Volume')
                cleanup_temporary_volume 
                ;;
            'Quit')
                break
                ;;
        esac
    done
}

# check if the function exists (bash specific)
if [ "$#" -eq 0 ]; then
  menu
else 
  "$@"
fi
