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

SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
# shellcheck source=./common.sh
source "$SCRIPT_DIR/common.sh"

ensure_repo_root
load_repo_hooks

if git rev-parse --is-inside-work-tree >/dev/null 2>&1 && has_remote; then
  current_branch="$(git rev-parse --abbrev-ref HEAD)"
  upstream_ref="$(git rev-parse --abbrev-ref --symbolic-full-name "@{upstream}" 2>/dev/null || true)"

  if [[ -n "$upstream_ref" ]] && ! git show-ref --verify --quiet "refs/remotes/$upstream_ref"; then
    echo "[agent-framework] Upstream ref '$upstream_ref' is missing; attempting to self-heal branch tracking"

    fallback_upstream=""
    if git show-ref --verify --quiet "refs/remotes/origin/develop"; then
      fallback_upstream="origin/develop"
    elif git show-ref --verify --quiet "refs/remotes/origin/main"; then
      fallback_upstream="origin/main"
    fi

    if [[ -n "$fallback_upstream" ]] && [[ "$current_branch" != "HEAD" ]]; then
      git branch --set-upstream-to="$fallback_upstream" "$current_branch" >/dev/null
      upstream_ref="$fallback_upstream"
      echo "[agent-framework] Set upstream for '$current_branch' to '$fallback_upstream'"
    else
      echo "[agent-framework] No fallback upstream found; skipping pull"
      upstream_ref=""
    fi
  fi

  if git diff --quiet && git diff --cached --quiet; then
    if [[ -n "$upstream_ref" ]]; then
      run_step "Pull latest changes" git pull --rebase
    else
      echo "[agent-framework] Skip pull: no valid upstream configured"
    fi
  else
    echo "[agent-framework] Skip pull: working tree has local changes"
  fi
fi

# ─── Mission state detection (ORCHESTRATOR-PROTOCOL) ────────────────────────
ORCH_DIR=".mosaic/orchestrator"
MISSION_JSON="$ORCH_DIR/mission.json"
COORD_LIB="$HOME/.config/mosaic/tools/orchestrator/_lib.sh"

if [[ -f "$MISSION_JSON" ]] && command -v jq &>/dev/null; then
  mission_status="$(jq -r '.status // "inactive"' "$MISSION_JSON")"

  if [[ "$mission_status" == "active" || "$mission_status" == "paused" ]]; then
    mission_name="$(jq -r '.name // "unnamed"' "$MISSION_JSON")"
    echo ""
    echo "========================================="
    echo "ACTIVE MISSION DETECTED"
    echo "========================================="
    echo "  Mission: $mission_name"

    manifest="docs/MISSION-MANIFEST.md"
    if [[ -f "$manifest" ]]; then
      phase="$(grep -m1 '^\*\*Phase:\*\*' "$manifest" 2>/dev/null | sed 's/.*\*\*Phase:\*\* //' || true)"
      milestone="$(grep -m1 '^\*\*Current Milestone:\*\*' "$manifest" 2>/dev/null | sed 's/.*\*\*Current Milestone:\*\* //' || true)"
      progress="$(grep -m1 '^\*\*Progress:\*\*' "$manifest" 2>/dev/null | sed 's/.*\*\*Progress:\*\* //' || true)"
      [[ -n "$phase" ]] && echo "  Phase: $phase"
      [[ -n "$milestone" ]] && echo "  Milestone: $milestone"
      [[ -n "$progress" ]] && echo "  Progress: $progress"
    fi

    if [[ -f "docs/TASKS.md" ]]; then
      total="$(grep -c '^|' "docs/TASKS.md" 2>/dev/null || true)"
      total="${total:-0}"
      done_count="$(grep -ci '| done \|| completed ' "docs/TASKS.md" 2>/dev/null || true)"
      done_count="${done_count:-0}"
      approx_total=$(( total > 2 ? total - 2 : 0 ))
      echo "  Tasks: ~${done_count} done of ~${approx_total} total"
    fi

    if [[ -d "docs/scratchpads" ]]; then
      latest_sp="$(ls -t docs/scratchpads/*.md 2>/dev/null | head -1 || true)"
      [[ -n "$latest_sp" ]] && echo "  Scratchpad: $latest_sp"
    fi

    echo ""
    echo "  Resume: Read manifest + scratchpad before taking action."
    echo "  Protocol: ~/.config/mosaic/guides/ORCHESTRATOR-PROTOCOL.md"
    echo "========================================="
    echo ""

    if [[ -f "$COORD_LIB" ]]; then
      # shellcheck source=/dev/null
      source "$COORD_LIB"
      sess_id="$(next_session_id ".")"
      runtime="${MOSAIC_RUNTIME:-unknown}"
      session_lock_write "." "$sess_id" "$runtime" "$$"

      updated="$(jq \
        --arg sid "$sess_id" \
        --arg rt "$runtime" \
        --arg ts "$(iso_now)" \
        '.sessions += [{"session_id":$sid,"runtime":$rt,"started_at":$ts,"ended_at":"","ended_reason":"","milestone_at_end":"","tasks_completed":[],"last_task_id":""}]' \
        "$MISSION_JSON")"
      echo "$updated" > "$MISSION_JSON.tmp" && mv "$MISSION_JSON.tmp" "$MISSION_JSON"
    fi
  fi
fi

if declare -F mosaic_hook_session_start >/dev/null 2>&1; then
  run_step "Run repo start hook" mosaic_hook_session_start
else
  echo "[agent-framework] No repo start hook configured (.mosaic/repo-hooks.sh)"
fi
