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

WORKDIR="/home/mikael/.openclaw/workspace"
STATE_FILE="$WORKDIR/last_email_summary_ts"
LOG_DIR="$WORKDIR/logs"
TMP_DIR="/tmp"
PROMO_RULES="$WORKDIR/promotions_domains.txt"
DRY_RUN=${DRY_RUN:-0}
ARCHIVE=${ARCHIVE:-0}
ACCOUNT=${HIMALAYA_ACCOUNT:-gmail}
PAGE_SIZE=200
OUT_PLAIN="$TMP_DIR/email_summary.txt"
OUT_HTML="$TMP_DIR/email_summary.html"

mkdir -p "$LOG_DIR"
exec >> "$LOG_DIR/email_summary_himalaya.log" 2>&1

echo "---"; echo "email_summary_himalaya.sh run: $(date --iso-8601=seconds)";

# load env if present
if [ -f "$WORKDIR/.env" ]; then
  # shellcheck disable=SC1090
  source "$WORKDIR/.env"
fi

# compute from-date
if [ -f "$STATE_FILE" ]; then
  LAST_TS=$(cat "$STATE_FILE")
  FROM_DATE=$(date -d "@$LAST_TS" +%Y-%m-%d)
else
  # default to 7 days back
  FROM_DATE=$(date -d "7 days ago" +%Y-%m-%d)
fi

echo "Using himalaya account: $ACCOUNT";
echo "Searching messages since: $FROM_DATE";

# fetch envelopes
ENVELOPES_JSON="$TMP_DIR/himalaya_envelopes.json"
himalaya envelope list -a "$ACCOUNT" after "$FROM_DATE" order by date desc -s $PAGE_SIZE -o json > "$ENVELOPES_JSON" || true

COUNT=$(jq 'length' "$ENVELOPES_JSON" 2>/dev/null || echo 0)
echo "Fetched $COUNT envelopes"

if [ "$COUNT" -eq 0 ]; then
  echo "No new messages since $FROM_DATE. Updating state timestamp and exiting.";
  date +%s > "$STATE_FILE"
  exit 0
fi

# load promotions domains file (optional)
PROMO_DOMAINS=()
if [ -f "$PROMO_RULES" ]; then
  mapfile -t PROMO_DOMAINS < "$PROMO_RULES"
fi

# keywords for promotions
PROMO_KEYWORDS=("rabatt" "kupong" "deal" "erbjud" "kampanj" "fynda" "sale" "coupon" "%" "off" "pris" "nyhetsbrev")

# helper: detect promotions
is_promo() {
  local from="$1"; local subj="$2"
  local lower_from=$(echo "$from" | tr '[:upper:]' '[:lower:]')
  local lower_subj=$(echo "$subj" | tr '[:upper:]' '[:lower:]')

  for d in "${PROMO_DOMAINS[@]}"; do
    if [[ "$lower_from" == *"$d"* ]]; then
      return 0
    fi
  done
  for k in "${PROMO_KEYWORDS[@]}"; do
    if [[ "$lower_subj" == *"$k"* ]]; then
      return 0
    fi
  done
  return 1
}

# prepare outputs
echo "Automatisk sammanfattning: olästa mejl sedan $FROM_DATE" > "$OUT_PLAIN"
printf "<h1>Automatisk sammanfattning: olästa mejl sedan %s</h1>\n" "$FROM_DATE" > "$OUT_HTML"

# iterate envelopes and classify
ARCHIVE_IDS=( )
TOTAL=0
jq -c '.[]' "$ENVELOPES_JSON" | while read -r env; do
  ID=$(echo "$env" | jq -r '.id')
  DATE=$(echo "$env" | jq -r '.date')
  FROM=$(echo "$env" | jq -r '.from')
  SUBJECT=$(echo "$env" | jq -r '.subject')
  FLAGS=$(echo "$env" | jq -r '.flags | join(", ")')

  TOTAL=$((TOTAL+1))

  # determine importance heuristic
  IMPORTANCE="Low"
  ACTION="Read"
  if echo "$SUBJECT" | grep -Ei "invoice|payment|payment failure|action needed|urgent|invoice|faktura" >/dev/null; then
    IMPORTANCE="High"
    ACTION="Read / Reply"
  fi
  if echo "$FLAGS" | grep -E "Important|\"\\Important\\\"" >/dev/null; then
    IMPORTANCE="High"
    ACTION="Read / Reply"
  fi

  # write to outputs
  echo "Subject: $SUBJECT" >> "$OUT_PLAIN"
  echo "From: $FROM" >> "$OUT_PLAIN"
  echo "Date: $DATE" >> "$OUT_PLAIN"
  echo "Summary: (auto)" >> "$OUT_PLAIN"
  echo "Suggested action: $ACTION" >> "$OUT_PLAIN"
  echo "Importance: $IMPORTANCE" >> "$OUT_PLAIN"
  echo "ID: $ID" >> "$OUT_PLAIN"
  echo "---" >> "$OUT_PLAIN"

  printf "<h2>%s</h2><p><b>From:</b> %s — <b>Date:</b> %s</p><p><b>Importance:</b> %s — <b>Action:</b> %s</p><hr>\n" "$(echo "$SUBJECT" | sed 's/&/\&amp;/g')" "$(echo "$FROM" | sed 's/&/\&amp;/g')" "$DATE" "$IMPORTANCE" "$ACTION" >> "$OUT_HTML"

  # detect promotions
  if is_promo "$FROM" "$SUBJECT"; then
    ARCHIVE_IDS+=("$ID")
  fi

done

# write footer
echo "Total messages processed: $TOTAL" >> "$OUT_PLAIN"
printf "<p>Total messages processed: %d</p>\n" "$TOTAL" >> "$OUT_HTML"

# summarize promotions — never auto-archive by default
echo "Promotions detected: ${#ARCHIVE_IDS[@]}" >> "$OUT_PLAIN"
printf "<p>Promotions detected: %d</p>\n" "${#ARCHIVE_IDS[@]}" >> "$OUT_HTML"
if [ ${#ARCHIVE_IDS[@]} -gt 0 ]; then
  echo "Promotion IDs:" >> "$OUT_PLAIN"
  printf "<ul>\n" >> "$OUT_HTML"
  for id in "${ARCHIVE_IDS[@]}"; do
    echo "$id" >> "$OUT_PLAIN"
    printf "<li>%s</li>\n" "$id" >> "$OUT_HTML"
  done
  printf "</ul>\n" >> "$OUT_HTML"
fi

if [ "$ARCHIVE" -eq 1 ]; then
  echo "ARCHIVE=1 specified — archiving ${#ARCHIVE_IDS[@]} messages now" >> "$OUT_PLAIN"
  printf "<p>Archiving %d promotions</p>\n" "${#ARCHIVE_IDS[@]}" >> "$OUT_HTML"
  for id in "${ARCHIVE_IDS[@]}"; do
    echo "Moving message $id to [Gmail]/All e-post" >> "$LOG_DIR/email_summary_himalaya.log"
    himalaya message move "$id" "[Gmail]/All e-post" -a "$ACCOUNT" || echo "Failed to move $id"
  done
else
  echo "No archiving performed. To archive promotions run with ARCHIVE=1." >> "$OUT_PLAIN"
  printf "<p>No archiving performed. To archive promotions run with ARCHIVE=1.</p>\n" >> "$OUT_HTML"
fi

# update state timestamp
date +%s > "$STATE_FILE"

echo "Summary written to: $OUT_PLAIN and $OUT_HTML"

exit 0
