#!/usr/bin/env bash
set -euo pipefail

REPO_ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
LAB_DIR="${REPO_ROOT}/.lab"
TMP_DIR="$(mktemp -d "${TMPDIR:-/tmp}/jeannie-unit.XXXXXX")"
BACKUP_DIR="${TMP_DIR}/backup"
FAILURES=0

mkdir -p "${BACKUP_DIR}" "${LAB_DIR}" "${TMP_DIR}/bin"

cleanup() {
    for file in pimox-workers.tsv cluster-workers.auto.tfvars.json; do
        rm -f "${LAB_DIR}/${file}"
        if [[ -f "${BACKUP_DIR}/${file}" ]]; then
            cp "${BACKUP_DIR}/${file}" "${LAB_DIR}/${file}"
        fi
    done
    rm -rf "${TMP_DIR}"
}
trap cleanup EXIT

for file in pimox-workers.tsv cluster-workers.auto.tfvars.json; do
    if [[ -f "${LAB_DIR}/${file}" ]]; then
        cp "${LAB_DIR}/${file}" "${BACKUP_DIR}/${file}"
    fi
done

cat >"${TMP_DIR}/bin/tofu" <<'EOF'
#!/usr/bin/env bash
exit 1
EOF
chmod +x "${TMP_DIR}/bin/tofu"
export PATH="${TMP_DIR}/bin:${PATH}"

cat >"${LAB_DIR}/pimox-workers.tsv" <<'EOF'
pimox01	192.168.100.66	jv	pimox-worker-01	/home/jv/.ssh/id_ed25519
pimox02	192.168.100.67	jv	pimox-worker-02	/home/jv/.ssh/id_ed25519
pimox03	192.168.100.76	jv	pimox-worker-03	/home/jv/.ssh/id_ed25519
EOF

cat >"${LAB_DIR}/cluster-workers.auto.tfvars.json" <<'EOF'
{
  "worker_nodes": {
    "pimox01": {
      "host": "192.168.100.66",
      "user": "jv",
      "node_name": "pimox-worker-01",
      "ssh_private_key_path": "/home/jv/.ssh/id_ed25519"
    },
    "pimox02": {
      "host": "192.168.100.67",
      "user": "jv",
      "node_name": "pimox-worker-02",
      "ssh_private_key_path": "/home/jv/.ssh/id_ed25519"
    },
    "pimox03": {
      "host": "192.168.100.76",
      "user": "jv",
      "node_name": "pimox-worker-03",
      "ssh_private_key_path": "/home/jv/.ssh/id_ed25519"
    },
    "manual01": {
      "host": "192.168.100.99",
      "user": "jv",
      "node_name": "manual-worker-01",
      "ssh_private_key_path": "/home/jv/.ssh/id_ed25519"
    }
  }
}
EOF

export JEANNIE_LIBRARY_MODE=true
# shellcheck disable=SC1091
source "${REPO_ROOT}/jeannie"

pass() {
    printf 'ok    %s\n' "$1"
}

fail() {
    printf 'fail  %s\n' "$1"
    FAILURES=$((FAILURES + 1))
}

assert_eq() {
    local label="$1"
    local expected="$2"
    local actual="$3"

    if [[ "${actual}" == "${expected}" ]]; then
        pass "${label}"
    else
        fail "${label}: expected '${expected}', got '${actual}'"
    fi
}

test_pimox_worker_count_detects_generated_topology() {
    unset LAB_PIMOX_WORKER_COUNT
    assert_eq "detects 3 generated Pimox workers" "3" "$(pimox_worker_count_default)"
}

test_configured_worker_count_cannot_hide_existing_workers() {
    LAB_PIMOX_WORKER_COUNT=1
    assert_eq "effective count keeps detected 3 workers" "3" "$(pimox_worker_count_effective)"
    unset LAB_PIMOX_WORKER_COUNT
}

test_configured_worker_count_can_expand_target_set() {
    LAB_PIMOX_WORKER_COUNT=4
    assert_eq "effective count allows explicit expansion" "4" "$(pimox_worker_count_effective)"
    unset LAB_PIMOX_WORKER_COUNT
}

test_cluster_worker_targets_include_pimox_and_manual_workers() {
    CLUSTER_WORKER_TARGETS=()
    cluster_worker_targets
    local targets
    targets="$(printf '%s\n' "${CLUSTER_WORKER_TARGETS[@]}" | sort | paste -sd ',' -)"
    assert_eq "cluster targets include generated Pimox workers" "jv@192.168.100.66,jv@192.168.100.67,jv@192.168.100.76,jv@192.168.100.99" "${targets}"
}

test_report_renderer_hides_ok_links() {
    local output
    output="$(
        printf 'ok\tArea\tHealthy\tok\tdetail\tfix\tgraph\tquery\nwarn\tArea\tWarning\tneeds attention\tdetail\tfix\tgraph\tquery\n' |
            "${REPO_ROOT}/scripts/report-render" --title "Unit Report" --only all
    )"
    if grep -A4 'Healthy' <<<"${output}" | grep -Eq 'graph:|query:'; then
        fail "report renderer hides graph/query for ok rows"
    else
        pass "report renderer hides graph/query for ok rows"
    fi
}

test_pimox_worker_count_detects_generated_topology
test_configured_worker_count_cannot_hide_existing_workers
test_configured_worker_count_can_expand_target_set
test_cluster_worker_targets_include_pimox_and_manual_workers
test_report_renderer_hides_ok_links

if ((FAILURES > 0)); then
    printf '\n%s unit test(s) failed.\n' "${FAILURES}" >&2
    exit 1
fi

printf '\nAll jeannie unit tests passed.\n'
