#!/usr/bin/env bash
# Uji end-to-end Tahap 2: administrasi, hak akses, produk.
source "$(dirname "${BASH_SOURCE[0]}")/lib.sh"

login() { req POST /auth/login "{\"username\":\"$1\",\"password\":\"$2\"}"; echo "$BODY" | jq -r '.data.token'; }
SFX="$(date +%s)$RANDOM"

req POST /auth/login "{\"username\":\"${ADMIN_USER}\",\"password\":\"${ADMIN_PASS}\"}"
ADM="$(echo "$BODY" | jq -r '.data.token')"

req GET /admin/users '' "$ADM";                    expect "Admin: daftar pengguna -> 200" 200 -
[ "$(echo "$BODY" | jq -r '.data.meta.total')" -ge 1 ] && ok "Daftar memuat meta.total" || bad "meta.total" "$BODY"
req GET /admin/roles '' "$ADM";                    expect "Admin: daftar peran -> 200" 200 -
[ "$(echo "$BODY" | jq '.data.items | length')" -eq 5 ] && ok "Lima peran" || bad "Lima peran" "$BODY"

req POST /admin/users "{\"username\":\"e2e_${SFX}\",\"password\":\"Rahasia#2026\",\"full_name\":\"E2E Staf\",\"email\":\"e2e_${SFX}@tapak.test\",\"phone\":\"08123456789\",\"role_code\":\"SALES_STAFF\"}" "$ADM"
expect "Buat staf -> 201" 201 -
UID_NEW="$(echo "$BODY" | jq -r '.data.user_id')"
req POST /admin/users "{\"username\":\"e2e_${SFX}\",\"password\":\"Rahasia#2026\",\"full_name\":\"X\",\"email\":\"lain_${SFX}@tapak.test\",\"phone\":\"08123456789\",\"role_code\":\"SALES_STAFF\"}" "$ADM"
expect "Username duplikat -> 409 USER-002" 409 USER-002
req POST /admin/users '{"username":"x"}' "$ADM";   expect "Validasi -> 422 VAL-001" 422 VAL-001
req PATCH "/admin/users/${UID_NEW}" '{}' "$ADM";   expect "PATCH kosong -> 422" 422 VAL-001
req PATCH "/admin/users/${UID_NEW}" '{"full_name":"Nama Baru"}' "$ADM"; expect "PATCH nama -> 200" 200 -

STAFF="$(login "e2e_${SFX}" 'Rahasia#2026')"
req GET /admin/users '' "$STAFF";                  expect "Staf ke /admin/users -> 403 ACCESS-001" 403 ACCESS-001
req GET /admin/users;                              expect "Tanpa token ke /admin/users -> 401 AUTH-003" 401 AUTH-003
req GET /me/scope '' "$STAFF";                     expect "/me/scope staf -> 200" 200 -
[ "$(echo "$BODY" | jq -r '.data.seller_user_ids[0]')" = "$UID_NEW" ] && ok "Cakupan staf = dirinya sendiri" || bad "Cakupan staf" "$BODY"

req POST /admin/products "{\"product_code\":\"E2E-${SFX}\",\"product_name\":\"Produk E2E\",\"unit\":\"botol\",\"current_price\":38000}" "$ADM"
expect "Buat produk -> 201" 201 -
PID="$(echo "$BODY" | jq -r '.data.product_id')"
[ "$(echo "$BODY" | jq -r '.data.current_price')" = "38000.00" ] && ok "Harga berupa string 38000.00" || bad "Format harga" "$BODY"
req GET "/products/${PID}" '' "$STAFF";            expect "Staf melihat produk aktif -> 200" 200 -
req PATCH "/admin/products/${PID}" '{"is_active":false}' "$ADM"; expect "Nonaktifkan produk -> 200" 200 -
req GET "/products/${PID}" '' "$STAFF";            expect "Staf melihat produk nonaktif -> 404 PROD-001" 404 PROD-001
req POST /admin/products '{"product_name":"x","unit":"u","current_price":-1}' "$ADM"; expect "Harga negatif -> 422" 422 VAL-001

req PATCH "/admin/users/${UID_NEW}" '{"is_active":false}' "$ADM"; expect "Nonaktifkan staf -> 200" 200 -
req GET /auth/me '' "$STAFF";                      expect "Token staf nonaktif tak berlaku -> 401" 401 -

echo
echo "E2E admin: ${PASS} lolos, ${FAIL} gagal."
[ "$FAIL" -eq 0 ]
