#!/bin/bash

if [ -n "$ADDONS_GIT_REPOS" ]; then
    GITLAB_URL="${GITLAB_URL:="https://gitlab.com"}"
    FORGEJO_URL="${FORGEJO_URL:="https://codeberg.org"}"
    LOCAL_PATH="${LOCAL_PATH:="/var/lib/odoo/git"}"
    GIT_CLONE_DEPTH="${GIT_CLONE_DEPTH:="999"}"

    # Setup git ssh key
    mkdir -p ~/.ssh
    chmod 700 ~/.ssh
    if [ -n "$GIT_SSH_PRIVATE_KEY" ]; then
        log-entrypoint "Setup SSH key from env vars."
        DECODED_GIT_SSH_PRIVATE_KEY=$(echo -e "$GIT_SSH_PRIVATE_KEY" | base64 -d)
        echo "$DECODED_GIT_SSH_PRIVATE_KEY" > ~/.ssh/id_ed25519
        chmod 600 ~/.ssh/id_ed25519
        eval "$(ssh-agent -s)"
        ssh-add ~/.ssh/id_ed25519 || (log-entrypoint "Dumping ~/.ssh/id_ed25519 content:" && cat ~/.ssh/id_ed25519)
    fi

    # Make every git directory a safe directory
    git config --global --add safe.directory "*"

    # Clone git repo addons into local path
    log-entrypoint "Cloning git repos: $ADDONS_GIT_REPOS"
    ADDONS_GIT_REPOS=$(echo "$ADDONS_GIT_REPOS" | tr "," "\n")
    for ADDON_GIT_REPO in $ADDONS_GIT_REPOS; do

        # Supported urls:
        # ADDON_GIT_REPO=git@github.com:OCA/server-tools.git#16.0
        # ADDON_GIT_REPO=https://github.com/OCA/server-tools.git#16.0
        # ADDON_GIT_REPO=https://github.com/OCA/server-tools.git#18.0#8c5ea468176e8b960a0ae0a52128fc65e985e8a7

        GIT_URL=$(echo "$ADDON_GIT_REPO" | cut -d# -f1)
        GIT_BRANCH=$(echo "$ADDON_GIT_REPO" | cut -d# -f2)
        GIT_COMMIT=$(echo "$ADDON_GIT_REPO" | cut -d# -f3)
        GIT_HOSTNAME=$(parse-url "$GIT_URL" hostname)
        GIT_PROTO=$(parse-url "$GIT_URL" proto)
        GIT_PATH=$(parse-url "$GIT_URL" path | sed 's/.git//g')
        GIT_LOCAL_PATH="$LOCAL_PATH/${GIT_HOSTNAME}/$GIT_PATH"

        ssh-keyscan -t rsa,dsa "$GIT_HOSTNAME" > ~/.ssh/known_hosts 2>/dev/null

        if [ ! -d "$GIT_LOCAL_PATH/.git" ]; then

            # Clone git repo and submodules
            mkdir -p "$GIT_LOCAL_PATH"

            # Add GitHub personal access token
            if [ "${GIT_PROTO}${GIT_HOSTNAME}" = "https://github.com" ] && [ -n "$GITHUB_USERNAME" ]; then
                GIT_URL="${GIT_PROTO}${GITHUB_USERNAME}:${GITHUB_PAT}@${GIT_HOSTNAME}/${GIT_PATH}.git"
            fi

            # Add GitLab personal access token
            if [ "${GIT_PROTO}${GIT_HOSTNAME}" = "$GITLAB_URL" ] && [ -n "$GITLAB_USERNAME" ]; then
                GIT_URL="${GIT_PROTO}${GITLAB_USERNAME}:${GITLAB_PAT}@${GIT_HOSTNAME}/${GIT_PATH}.git"
            fi

            # Add Forgejo personal access token
            if [ "${GIT_PROTO}${GIT_HOSTNAME}" = "$FORGEJO_URL" ] && [ -n "$FORGEJO_USERNAME" ]; then
                GIT_URL="${GIT_PROTO}${FORGEJO_USERNAME}:${FORGEJO_PAT}@${GIT_HOSTNAME}/${GIT_PATH}.git"
            fi

            log-entrypoint "Clone ${GIT_PROTO}${GIT_HOSTNAME} branch $GIT_BRANCH."
            git clone --depth "$GIT_CLONE_DEPTH" --single-branch --branch "$GIT_BRANCH" "$GIT_URL" "$GIT_LOCAL_PATH"
        else
            log-entrypoint "Pull $GIT_BRANCH branch in $GIT_LOCAL_PATH."
            git -C "$GIT_LOCAL_PATH" switch "$GIT_BRANCH"
            git -C "$GIT_LOCAL_PATH" pull
        fi

        if [ -n "$GIT_COMMIT" ];then
            log-entrypoint "Checkout $GIT_COMMIT commit in $GIT_LOCAL_PATH."
            git -C "$GIT_LOCAL_PATH" checkout "$GIT_COMMIT"
        fi

        if [ -f "$GIT_LOCAL_PATH/.gitmodules" ]; then
            log-entrypoint "Init and update git submodules in $GIT_LOCAL_PATH."
            git -C "$GIT_LOCAL_PATH" submodule update --init --recursive --depth "$GIT_CLONE_DEPTH"
        fi
    done

    # Remove git ssh key
    if [ -n "$GIT_SSH_PRIVATE_KEY" ]; then
        ssh-add -d ~/.ssh/id_ed25519
        rm ~/.ssh/id_ed25519
    fi
fi
