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

FROM_DATE="${1:-$(date +%F)}"
TO_DATE="${2:-$FROM_DATE}"
REQUESTED_INTERFACE="${3:-${SALSABIL_DATA_INTERFACE:-}}"

if ! [[ "$FROM_DATE" =~ ^[0-9]{4}-[0-9]{2}-[0-9]{2}$ ]] || ! date -d "$FROM_DATE" +%F >/dev/null 2>&1; then
  echo "Date de début invalide. Format attendu : AAAA-MM-JJ" >&2
  exit 2
fi
if ! [[ "$TO_DATE" =~ ^[0-9]{4}-[0-9]{2}-[0-9]{2}$ ]] || ! date -d "$TO_DATE" +%F >/dev/null 2>&1; then
  echo "Date de fin invalide. Format attendu : AAAA-MM-JJ" >&2
  exit 2
fi
if [[ "$FROM_DATE" > "$TO_DATE" ]]; then
  echo "La date de début doit précéder la date de fin." >&2
  exit 2
fi

command -v vnstat >/dev/null 2>&1 || {
  echo "vnStat n'est pas installé. Lancez : sudo apt install -y vnstat && sudo systemctl enable --now vnstat" >&2
  exit 3
}

if [[ -n "$REQUESTED_INTERFACE" ]]; then
  INTERFACE="$REQUESTED_INTERFACE"
else
  INTERFACE="$(ip route show default 2>/dev/null | awk 'NR==1{print $5}')"
  [[ -n "$INTERFACE" ]] || INTERFACE="wlan0"
fi

REPORT_DIR="${HOME}/salsabil-tv-reports"
mkdir -p "$REPORT_DIR"
REPORT_FILE="$REPORT_DIR/consommation-${INTERFACE}-${FROM_DATE}_${TO_DATE}.txt"
JSON_FILE="$(mktemp)"
trap 'rm -f "$JSON_FILE"' EXIT

if ! vnstat -i "$INTERFACE" --json d 0 --begin "$FROM_DATE" --end "$TO_DATE" > "$JSON_FILE" 2>/dev/null; then
  echo "Aucune donnée vnStat disponible pour l'interface $INTERFACE." >&2
  echo "Vérifiez : vnstat --dbiflist 1" >&2
  exit 4
fi

python3 - "$JSON_FILE" "$INTERFACE" "$FROM_DATE" "$TO_DATE" > "$REPORT_FILE" <<'PY'
import json, sys
from datetime import datetime

path, interface, start, end = sys.argv[1:]
with open(path, 'r', encoding='utf-8') as handle:
    data = json.load(handle)

interfaces = data.get('interfaces') or []
iface = next((item for item in interfaces if str(item.get('name') or item.get('id')) == interface), interfaces[0] if interfaces else {})
traffic = iface.get('traffic') or {}
days = traffic.get('day') or traffic.get('days') or []

def date_of(item):
    date = item.get('date') or {}
    if isinstance(date, dict) and date.get('year'):
        return f"{int(date['year']):04d}-{int(date.get('month', 1)):02d}-{int(date.get('day', 1)):02d}"
    timestamp = item.get('timestamp')
    if timestamp:
        return datetime.fromtimestamp(int(timestamp)).strftime('%Y-%m-%d')
    return ''

selected = [item for item in days if start <= date_of(item) <= end]
rx = sum(int(item.get('rx') or 0) for item in selected)
tx = sum(int(item.get('tx') or 0) for item in selected)
total = rx + tx

def human(value):
    units = ['B', 'KiB', 'MiB', 'GiB', 'TiB']
    number = float(value)
    for unit in units:
        if number < 1024 or unit == units[-1]:
            return f"{number:.2f} {unit}"
        number /= 1024

def gb(value):
    return value / 1_000_000_000

print('RAPPORT DE CONSOMMATION INTERNET — SALSABIL SCREEN')
print('=' * 60)
print(f'Interface surveillée : {interface}')
print(f'Période              : {start} au {end}')
print(f'Données reçues       : {human(rx)} ({gb(rx):.3f} GB)')
print(f'Données envoyées     : {human(tx)} ({gb(tx):.3f} GB)')
print(f'TOTAL                 : {human(total)} ({gb(total):.3f} GB)')
print()
print('Détail journalier :')
if not selected:
    print('  Aucune journée encore enregistrée par vnStat pour cette période.')
else:
    for item in selected:
        day_rx = int(item.get('rx') or 0)
        day_tx = int(item.get('tx') or 0)
        print(f"  {date_of(item)}  reçu {human(day_rx):>12}  envoyé {human(day_tx):>12}  total {human(day_rx + day_tx):>12}")
print()
print('IMPORTANT : ce total couvre tout le trafic de cette interface du Raspberry Pi,')
print('y compris DNS, mises à jour système et autres applications. Si seul Salsabil Screen')
print('utilise le Raspberry, il constitue une bonne approximation de la consommation du kiosk.')
PY

{
  echo
  echo "Sortie vnStat d'origine :"
  echo "------------------------------------------------------------"
  vnstat -i "$INTERFACE" --days 0 --begin "$FROM_DATE" --end "$TO_DATE" 2>/dev/null || true
} >> "$REPORT_FILE"

cat "$REPORT_FILE"
echo
echo "Rapport enregistré : $REPORT_FILE"
