#!/usr/bin/env bash
# Uji end-to-end Tahap 3: customer, nomor telepon, kunjungan, foto (multipart sungguhan lewat curl).
source "$(dirname "${BASH_SOURCE[0]}")/lib.sh"

SFX="$(date +%s)$RANDOM"
TMPD="$(mktemp -d)"; trap 'kill ${SERVER_PID} 2>/dev/null; rm -f "${LOG}"; rm -rf "${TMPD}"' EXIT

# JPEG 1x1 valid, berkas palsu, dan berkas > 2 MB
base64 -d > "${TMPD}/ok.jpg" <<'B64'
/9j/4AAQSkZJRgABAQEASABIAAD/2wBDAP//////////////////////////////////////////////////////////////////////////////////////wgALCAABAAEBAREA/8QAFBABAAAAAAAAAAAAAAAAAAAAAP/aAAgBAQABPxA=
B64
echo "bukan gambar" > "${TMPD}/palsu.jpg"
cp "${TMPD}/ok.jpg" "${TMPD}/besar.jpg"; head -c $((2*1024*1024+10)) /dev/zero >> "${TMPD}/besar.jpg"

# upload <path> <token> <file> [field=value ...] -> menyetel STATUS, BODY
upload() {
  local path="$1" token="$2" file="$3"; shift 3
  local args=(-s -o /tmp/e2e_up.$$ -w '%{http_code} %{content_type}' -X POST "${BASE}${path}" -H "Authorization: Bearer ${token}")
  [ -n "$file" ] && args+=(-F "file=@${file};type=image/jpeg")
  for kv in "$@"; do args+=(-F "$kv"); done
  local out; out="$(curl "${args[@]}")"
  STATUS="${out%% *}"; CTYPE="${out#* }"; BODY="$(cat /tmp/e2e_up.$$)"; rm -f /tmp/e2e_up.$$
}
tok() { req POST /auth/login "{\"username\":\"$1\",\"password\":\"$2\"}"; echo "$BODY" | jq -r '.data.token'; }

req POST /auth/login "{\"username\":\"${ADMIN_USER}\",\"password\":\"${ADMIN_PASS}\"}"
ADM="$(echo "$BODY" | jq -r '.data.token')"
mkuser() { req POST /admin/users "{\"username\":\"$1_${SFX}\",\"password\":\"Rahasia#2026\",\"full_name\":\"$1\",\"email\":\"$1_${SFX}@tapak.test\",\"phone\":\"08123456789\",\"role_code\":\"$2\"}" "$ADM"; }
mkuser e3s1 SALES_STAFF; mkuser e3s2 SALES_STAFF; mkuser e3dir SALES_DIRECTOR
S1="$(tok "e3s1_${SFX}" 'Rahasia#2026')"; S2="$(tok "e3s2_${SFX}" 'Rahasia#2026')"; DIR="$(tok "e3dir_${SFX}" 'Rahasia#2026')"
N=$(( (RANDOM % 9000) + 1000 ))   # nomor unik per eksekusi: 0813 1000 NNNN

req POST /customers "{\"full_name\":\"Warung E2E\",\"phone\":\"0813-1000-${N}\",\"address\":\"Jl. Uji 1\"}" "$S1"
expect "Buat customer -> 201" 201 -
CID="$(echo "$BODY" | jq -r '.data.customer_id')"
[ "$(echo "$BODY" | jq -r '.data.phone')" = "628131000${N}" ] && ok "Telepon dinormalisasi ke 62..." || bad "Normalisasi" "$BODY"
[ "$(echo "$BODY" | jq -r '.data.status')" = "PROSPECT" ] && ok "Status awal PROSPECT" || bad "Status awal" "$BODY"

req POST /customers "{\"full_name\":\"Ganda\",\"phone\":\"+62 813 1000 ${N}\",\"address\":\"X\"}" "$S2"
expect "Nomor ganda -> 409 CUST-002" 409 CUST-002
[ "$(echo "$BODY" | jq -r '.error.details.customer_id')" = "$CID" ] && ok "Respons menunjuk customer yang ada" || bad "details.customer_id" "$BODY"
req GET "/customers/lookup?phone=0813%201000%20${N}" '' "$S2"
[ "$(echo "$BODY" | jq -r '.data.found')" = "true" ] && ok "Lookup menemukan customer" || bad "Lookup" "$BODY"
req GET "/customers/${CID}" '' "$S2";              expect "Staf lain membuka customer yang ada -> 200" 200 -
req POST /customers '{"full_name":"x"}' "$S1";      expect "Validasi customer -> 422" 422 VAL-001
req POST /customers "{\"full_name\":\"x\",\"phone\":\"08139000001\",\"address\":\"y\"}" "$DIR"; expect "Direktur tidak boleh menulis -> 403" 403 ACCESS-001
req GET /customers '' "$ADM";                      expect "Admin tidak mengakses customer -> 403" 403 ACCESS-001

req POST /visits "{\"customer_id\":${CID},\"result_code\":\"TERTARIK\",\"notes\":\"uji\",\"latitude\":-6.9011,\"longitude\":107.657}" "$S1"
expect "Kunjungan dengan GPS -> 201" 201 -
VID="$(echo "$BODY" | jq -r '.data.visit_id')"
[ "$(echo "$BODY" | jq -r '.data.location_status')" = "AVAILABLE" ] && ok "GPS AVAILABLE" || bad "GPS" "$BODY"
req POST /visits "{\"customer_id\":${CID},\"result_code\":\"PEMILIK_TIDAK_ADA\"}" "$S1"
expect "Kunjungan tanpa GPS -> 201" 201 -
[ "$(echo "$BODY" | jq -r '.data.location_label')" = "Lokasi tidak tersedia" ] && ok "Penanda lokasi tidak tersedia" || bad "Label" "$BODY"
req POST /visits "{\"customer_id\":${CID},\"result_code\":\"LAIN\"}" "$S1";  expect "Hasil tidak dikenal -> 422" 422 VAL-001
req GET "/visits/${VID}" '' "$S2";                 expect "Staf lain tidak melihat kunjungan -> 404 VISIT-001" 404 VISIT-001
req GET "/visits/${VID}" '' "$DIR";                expect "Direktur melihat kunjungan -> 200" 200 -

upload "/visits/${VID}/photos" "$S1" "${TMPD}/ok.jpg" latitude=-6.9011 longitude=107.657
expect "Unggah foto JPEG -> 201" 201 -
PID="$(echo "$BODY" | jq -r '.data.photo_id')"
[ "$(echo "$BODY" | jq -r '.data.upload_status')" = "SUCCESS" ] && ok "Status SUCCESS" || bad "Status foto" "$BODY"
upload "/visits/${VID}/photos" "$S1" "${TMPD}/palsu.jpg";  expect "Berkas bukan JPEG -> 415 PHOTO-004" 415 PHOTO-004
upload "/visits/${VID}/photos" "$S1" "${TMPD}/besar.jpg";  expect "Berkas > 2 MB -> 413 PHOTO-002" 413 PHOTO-002
upload "/visits/${VID}/photos" "$S1" "";                   expect "Tanpa berkas -> 422" 422 VAL-001
upload "/visits/${VID}/photos" "$S2" "${TMPD}/ok.jpg";     expect "Staf lain unggah ke kunjungan ini -> 404" 404 VISIT-001
for i in 2 3 4 5; do upload "/visits/${VID}/photos" "$S1" "${TMPD}/ok.jpg"; done
upload "/visits/${VID}/photos" "$S1" "${TMPD}/ok.jpg";     expect "Foto ke-6 -> 409 PHOTO-003" 409 PHOTO-003
upload "/photos/${PID}/file" "$S1" "${TMPD}/ok.jpg";       expect "Ulang pada foto SUCCESS -> 409 PHOTO-006" 409 PHOTO-006

curl -s -o "${TMPD}/dl.jpg" -w '%{http_code} %{content_type}' -H "Authorization: Bearer ${S1}" "${BASE}/photos/${PID}/file" > "${TMPD}/dl.meta"
[ "$(cut -d' ' -f1 "${TMPD}/dl.meta")" = "200" ] && [ "$(cut -d' ' -f2 "${TMPD}/dl.meta")" = "image/jpeg" ] && cmp -s "${TMPD}/ok.jpg" "${TMPD}/dl.jpg" \
  && ok "Unduh foto: 200, image/jpeg, isi identik" || bad "Unduh foto" "$(cat "${TMPD}/dl.meta")"
req GET "/photos/${PID}/file" '' "$S2";            expect "Foto di luar cakupan -> 404 PHOTO-001" 404 PHOTO-001
req GET "/photos/${PID}/file";                     expect "Foto tanpa token -> 401" 401 AUTH-003

upload "/customers/${CID}/photos" "$S2" "${TMPD}/ok.jpg";  expect "Foto customer oleh staf lain -> 201" 201 -
req GET "/customers/${CID}" '' "$DIR"
[ "$(echo "$BODY" | jq '.data.photos | length')" = "1" ] && ok "Detail customer memuat foto" || bad "Foto customer" "$BODY"

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