#!/usr/bin/env bash

list-dotenv() {
    TASK_DOTENV_DIR=${TASK_DOTENV_DIR:="$HOME/.config/taskfile.build"}

    relative-path() {
        local target="$1"
        local base="$2"
        if command -v realpath >/dev/null 2>&1; then
            realpath --relative-to="$base" "$target" 2>/dev/null || echo "$target"
        else
            if [[ "$target" == "$base"/* ]]; then
                echo "${target#"$base"/}"
            else
                echo "$target"
            fi
        fi
    }

    env-name() {
        local env_name
        env_name=$(basename "$1")

        if [[ "$env_name" == .env.* ]]; then
            env_name="${env_name#.env.}.env"
        fi

        echo "${env_name%.env}"
    }

    local -a env_files=()

    for env_file in "$TASK_DOTENV_DIR"/*.env "$TASK_DOTENV_DIR"/.env.* ./*.env .env.*; do
        if [[ -f "$env_file" ]]; then
            env_files+=("$env_file")
        fi
    done

    local name_width=4
    local path_width=4

    for env_file in "${env_files[@]}"; do
        local env_name rel_path
        env_name=$(env-name "$env_file")
        rel_path=$(relative-path "$env_file" "$PWD")
        (( ${#env_name} > name_width )) && name_width=${#env_name}
        (( ${#rel_path} > path_width )) && path_width=${#rel_path}
    done

    printf '| %-*s | %-*s |\n' "$name_width" "Name" "$path_width" "Path"
    printf '|-%*s-|-%*s-|\n' "$name_width" "" "$path_width" "" | tr ' ' '-'

    for env_file in "${env_files[@]}"; do
        local env_name rel_path
        env_name=$(env-name "$env_file")
        rel_path=$(relative-path "$env_file" "$PWD")
        printf '| %-*s | %-*s |\n' "$name_width" "$env_name" "$path_width" "$rel_path"
    done
}
lid() {
    list-dotenv "$@"
}
