#!/usr/bin/env bash
# Uji end-to-end Tahap 5: laporan aktual terhadap DATA DEMO Januari 2026 (php cli/load-demo.php).
# Database uji harus berisi data demo (run-all.sh menyiapkannya).
source "$(dirname "${BASH_SOURCE[0]}")/lib.sh"

tok() { req POST /auth/login "{\"username\":\"$1\",\"password\":\"Tapak#2026\"}"; echo "$BODY" | jq -r '.data.token'; }
P='from=2026-01-01&to=2026-01-31'
D="$(tok hendra.wijaya)"; R="$(tok rina.kusumawati)"; AG="$(tok agus.setiawan)"; DW="$(tok dewi.lestari)"
BU="$(tok budi.santoso)"; AD="$(tok admin.tapak)"
eq() { # eq <deskripsi> <ekspresi jq> <nilai>
  local got; got="$(echo "$BODY" | jq -r "$2")"
  [ "$got" = "$3" ] && ok "$1" || bad "$1" "hasil '${got}', seharusnya '${3}'"
}

echo "-- Ringkasan (direktur)"
req GET "/reports/summary?$P" '' "$D"; expect "Ringkasan Januari -> 200" 200 -
eq "Kunjungan 27" '.data.visit_count' 27
eq "Customer baru 13" '.data.new_customer_count' 13
eq "Penjualan resmi: 14 transaksi" '.data.official_sales.transaction_count' 14
eq "Penjualan resmi: Rp18.772.500" '.data.official_sales.total_amount' 18772500.00
eq "WAITING_APPROVAL 1 (584000.00)" '.data.transactions_by_status.WAITING_APPROVAL | "\(.transaction_count) \(.total_amount)"' '1 584000.00'
eq "REJECTED 1 (336000.00)" '.data.transactions_by_status.REJECTED | "\(.transaction_count) \(.total_amount)"' '1 336000.00'
eq "CANCELLED 1 (1312000.00) tidak masuk penjualan resmi" '.data.transactions_by_status.CANCELLED | "\(.transaction_count) \(.total_amount)"' '1 1312000.00'
req GET "/reports/summary?from=2026-02-01&to=2026-02-28" '' "$D"
eq "Periode tanpa data: penjualan 0.00" '.data.official_sales.total_amount' 0.00
eq "Periode tanpa data: kunjungan 0" '.data.visit_count' 0

echo "-- Penjualan resmi per tim / produk / bulan"
req GET "/reports/sales?$P&group_by=team" '' "$D"; expect "Penjualan per tim -> 200" 200 -
eq "Tim Alfa 8 trx Rp10.649.000" '.data.groups[] | select(.label=="Tim Alfa") | "\(.transaction_count) \(.total_amount)"' '8 10649000.00'
eq "Tim Beta 6 trx Rp8.123.500" '.data.groups[] | select(.label=="Tim Beta") | "\(.transaction_count) \(.total_amount)"' '6 8123500.00'
eq "Total penjualan per tim" '.data.total_amount' 18772500.00
ALFA="$(echo "$BODY" | jq -r '.data.groups[] | select(.label=="Tim Alfa") | .key')"
req GET "/reports/sales?$P&group_by=product" '' "$D"
eq "Total per produk sama dengan penjualan resmi" '.data.total_amount' 18772500.00
eq "Minyak muncul satu kali pada laporan per produk" '.data.groups | map(select(.label=="Minyak Goreng 2 Liter")) | length' 1
req GET "/reports/sales?$P&group_by=month" '' "$D"
eq "Per bulan: satu kelompok 2026-01" '.data.groups | map("\(.key) \(.transaction_count)") | join(",")' '2026-01 14'
req GET "/reports/sales?$P&group_by=user" '' "$D"
eq "Per staf: Budi 3 trx Rp3.808.000" '.data.groups[] | select(.label=="Budi Santoso") | "\(.transaction_count) \(.total_amount)"' '3 3808000.00'

echo "-- Kunjungan dan customer baru"
req GET "/reports/visits?$P&group_by=team" '' "$D"
eq "Kunjungan Tim Alfa 15" '.data.groups[] | select(.label=="Tim Alfa") | .visit_count' 15
eq "Kunjungan Tim Beta 12" '.data.groups[] | select(.label=="Tim Beta") | .visit_count' 12
eq "Total kunjungan 27" '.data.total_visit_count' 27
req GET "/reports/visits?$P&group_by=user" '' "$D"
eq "Budi: 5 kunjungan, 3 ORDER" '.data.groups[] | select(.label=="Budi Santoso") | "\(.visit_count) \(.by_result.ORDER)"' '5 3'
req GET "/reports/new-customers?$P&group_by=team" '' "$D"
eq "Customer baru Tim Alfa 7" '.data.groups[] | select(.label=="Tim Alfa") | .new_customer_count' 7
eq "Customer baru Tim Beta 6" '.data.groups[] | select(.label=="Tim Beta") | .new_customer_count' 6
req GET "/reports/new-customers?$P&group_by=user" '' "$D"
eq "Budi mendaftarkan 2 customer" '.data.groups[] | select(.label=="Budi Santoso") | .new_customer_count' 2

echo "-- Cakupan per peran"
req GET "/reports/summary?$P" '' "$R"
eq "Manajer: penjualan resmi seluruh tim" '.data.official_sales.total_amount' 18772500.00
req GET "/reports/summary?$P" '' "$AG"
eq "Ketua Alfa: 8 trx" '.data.official_sales.transaction_count' 8
eq "Ketua Alfa: Rp10.649.000" '.data.official_sales.total_amount' 10649000.00
req GET "/reports/summary?$P" '' "$DW"
eq "Ketua Beta: Rp8.123.500" '.data.official_sales.total_amount' 8123500.00
req GET "/reports/summary?$P" '' "$BU"
eq "Staf Budi: 5 kunjungan" '.data.visit_count' 5
eq "Staf Budi: 3 trx Rp3.808.000" '.data.official_sales | "\(.transaction_count) \(.total_amount)"' '3 3808000.00'
req GET "/reports/summary?$P&user_id=7" '' "$BU"; expect "Staf memfilter staf lain -> 200 kosong" 200 -
eq "Hasil filter di luar cakupan kosong" '.data.visit_count' 0
req GET "/reports/summary?$P&team_id=${ALFA}" '' "$DW"
eq "Ketua Beta memfilter tim Alfa -> kosong" '.data.official_sales.transaction_count' 0
req GET "/reports/summary?$P&team_id=${ALFA}" '' "$D"
eq "Direktur memfilter tim Alfa -> 8" '.data.official_sales.transaction_count' 8
req GET "/reports/summary?$P" '' "$AD"; expect "Admin tidak boleh -> 403" 403 ACCESS-001
req GET "/reports/summary?$P"; expect "Tanpa token -> 401" 401 AUTH-003
req POST "/reports/summary" '{}' "$D"; expect "Laporan hanya-baca (POST -> 405/404)" 405 ROUTE-002

echo "-- Validasi"
req GET "/reports/summary" '' "$D"; expect "Tanpa periode -> 422" 422 VAL-001
req GET "/reports/summary?from=2026-01-31&to=2026-01-01" '' "$D"; expect "Akhir sebelum awal -> 422" 422 VAL-001
req GET "/reports/summary?from=2026-02-30&to=2026-03-01" '' "$D"; expect "Tanggal tidak valid -> 422" 422 VAL-001
req GET "/reports/summary?from=2020-01-01&to=2026-01-01" '' "$D"; expect "Rentang > 366 hari -> 422" 422 VAL-001
req GET "/reports/sales?$P&group_by=warna" '' "$D"; expect "group_by tak dikenal -> 422" 422 VAL-001
req GET "/reports/visits?$P&group_by=product" '' "$D"; expect "Kunjungan per produk -> 422" 422 VAL-001

echo "-- Laporan pemeriksaan"
req GET "/reports/reviews?$P" '' "$D"; expect "Laporan pemeriksaan -> 200" 200 -
eq "Ringkasan status: 14/1/1/1" '.data.status_summary | "\(.APPROVED.transaction_count)/\(.WAITING_APPROVAL.transaction_count)/\(.REJECTED.transaction_count)/\(.CANCELLED.transaction_count)"' '14/1/1/1'
eq "Total daftar 17 transaksi" '.data.meta.total' 17
req GET "/reports/reviews?$P&status=REJECTED" '' "$D"
eq "Ditolak: T16 Rp336.000" '.data.items | map("\(.transaction_code) \(.total_amount)") | join(",")' 'TRX-20260129-002 336000.00'
eq "Ditolak: alasan keputusan terakhir" '.data.items[0].latest_review.reason' 'Jumlah belum dikonfirmasi pelanggan. Mohon konfirmasi lalu kirim ulang.'
req GET "/reports/reviews?$P&status=APPROVED&per_page=100" '' "$D"
eq "T12 disetujui setelah 2 penolakan" '.data.items[] | select(.transaction_code=="TRX-20260121-001") | "\(.rejection_count) \(.review_count) \(.latest_review.decision)"' '2 3 APPROVED'
req GET "/reports/reviews?$P&status=CANCELLED" '' "$R"
eq "Dibatalkan: alasan oleh Rina" '.data.items[0].latest_review | "\(.decision) \(.reviewer.full_name)"' 'CANCELLED Rina Kusumawati'
req GET "/reports/reviews?$P&status=BUKAN" '' "$D"; expect "Status tidak dikenal -> 422" 422 VAL-001

echo "-- Rincian kunjungan dan daftar transaksi"
req GET "/reports/visit-details?$P&per_page=100" '' "$D"; expect "Rincian kunjungan -> 200" 200 -
eq "27 kunjungan" '.data.meta.total' 27
eq "Kunjungan pertama Warung Bu Siti punya 2 foto" '[.data.items[] | select(.customer.full_name=="Warung Bu Siti")] | sort_by(.visited_at) | .[0].photos | length' 2
eq "Kunjungan Dian tanpa GPS: lokasi tidak tersedia" '[.data.items[] | select(.location_status=="UNAVAILABLE")] | map(.location_label) | unique | join(",")' 'Lokasi tidak tersedia'
req GET "/reports/visit-details?$P&per_page=100" '' "$BU"
eq "Rincian kunjungan staf hanya miliknya" '.data.meta.total' 5
req GET "/reports/transactions?$P&status=APPROVED&team_id=${ALFA}&per_page=100" '' "$D"; expect "Daftar transaksi tim Alfa -> 200" 200 -
eq "8 transaksi APPROVED tim Alfa" '.data.meta.total' 8
eq "Setiap transaksi punya customer, penjual, dan item" '[.data.items[] | select(.customer.full_name != null and .seller.full_name != null and (.items | length) > 0)] | length' 8
eq "Total item = total header (T1)" '.data.items[] | select(.transaction_code=="TRX-20260106-001") | "\(.total_amount) \(.items|length)"' '1286000.00 3'
eq "Harga historis T1 minyak Rp36.000" '.data.items[] | select(.transaction_code=="TRX-20260106-001") | .items[] | select(.product.product_code=="MYK-002") | .unit_price' 36000.00

echo "-- Foto demo dapat diambil"
req GET "/photos/1/file" "" "$BU" 2>/dev/null
[ "$STATUS" = "200" ] && ok "Berkas foto demo 200" || bad "Foto" "status ${STATUS}"
case "$CTYPE" in image/jpeg*) ok "Content-Type image/jpeg" ;; *) bad "Foto" "Content-Type ${CTYPE}" ;; esac

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