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

chunk_lifecycle_repo_root() {
  if [[ -n "${CHUNK_LIFECYCLE_REPO_ROOT:-}" ]]; then
    printf '%s\n' "$CHUNK_LIFECYCLE_REPO_ROOT"
    return
  fi
  cd "$(dirname "${BASH_SOURCE[0]}")/../.." >/dev/null
  pwd
}

chunk_lifecycle_active_dir() {
  local root
  root="$(chunk_lifecycle_repo_root)"
  printf '%s\n' "${CHUNK_LIFECYCLE_ACTIVE_DIR:-$root/ai/chunks/active}"
}

chunk_lifecycle_backlog_dir() {
  local root
  root="$(chunk_lifecycle_repo_root)"
  printf '%s\n' "${CHUNK_LIFECYCLE_BACKLOG_DIR:-$root/ai/chunks/backlog}"
}

chunk_lifecycle_completed_dir() {
  local root
  root="$(chunk_lifecycle_repo_root)"
  printf '%s\n' "${CHUNK_LIFECYCLE_COMPLETED_DIR:-$root/ai/chunks/completed}"
}

chunk_lifecycle_registry_path() {
  local root
  root="$(chunk_lifecycle_repo_root)"
  printf '%s\n' "${CHUNK_LIFECYCLE_REGISTRY:-$root/ai/governance/registries/chunk-lifecycle.yaml}"
}

chunk_lifecycle_find_chunk() {
  local query="${1:?chunk id or path is required}"
  if [[ -f "$query" ]]; then
    printf '%s\n' "$query"
    return
  fi

  local dir file matches=()
  for dir in "$(chunk_lifecycle_active_dir)" "$(chunk_lifecycle_backlog_dir)" "$(chunk_lifecycle_completed_dir)"; do
    [[ -d "$dir" ]] || continue
    while IFS= read -r file; do
      matches+=("$file")
    done < <(find "$dir" -maxdepth 1 -type f -name "*${query}*.md" | sort)
  done

  if [[ "${#matches[@]}" -ne 1 ]]; then
    printf 'chunk lifecycle error: expected one chunk matching %s, found %s\n' "$query" "${#matches[@]}" >&2
    return 2
  fi
  printf '%s\n' "${matches[0]}"
}

chunk_lifecycle_status() {
  local file="${1:?chunk file is required}"
  awk -F': *' '/^Status:/ { print $2; exit }' "$file"
}

chunk_lifecycle_update_status() {
  local file="${1:?chunk file is required}"
  local status="${2:?target status is required}"
  node - "$file" "$status" <<'NODE'
const fs = require('node:fs');
const [file, status] = process.argv.slice(2);
const text = fs.readFileSync(file, 'utf8');
if (!/^Status:\s*.+$/m.test(text)) {
  console.error(`chunk lifecycle error: Status field not found in ${file}`);
  process.exit(2);
}
fs.writeFileSync(file, text.replace(/^Status:\s*.+$/m, `Status: ${status}`));
NODE
}

chunk_lifecycle_append_transition_evidence() {
  local file="${1:?chunk file is required}"
  local from="${2:?source state is required}"
  local to="${3:?target state is required}"
  local recommendation="${4:-unspecified}"
  local approval_state="${5:-not_required}"
  local timestamp
  timestamp="$(date -u +%Y-%m-%dT%H:%M:%SZ)"
  node - "$file" "$from" "$to" "$recommendation" "$approval_state" "$timestamp" <<'NODE'
const fs = require('node:fs');
const [file, from, to, recommendation, approvalState, timestamp] = process.argv.slice(2);
let text = fs.readFileSync(file, 'utf8');
const block = [
  '',
  '## Lifecycle Transition Evidence',
  '',
  `- Transition: ${from} -> ${to}`,
  '- Tool: `ai/chunks/transition.sh`',
  `- Timestamp: ${timestamp}`,
  `- Recommendation: ${recommendation}`,
  `- Approval Side Effect: ${approvalState}`,
  '',
].join('\n');
fs.writeFileSync(file, text.replace(/\s*$/, '\n') + block);
NODE
}

chunk_lifecycle_timeline() {
  local event_type="${1:?event type is required}"
  local status="${2:?status is required}"
  local message="${3:?message is required}"
  local action="${4:-chunk_transition}"
  local root
  root="$(chunk_lifecycle_repo_root)"
  if [[ -x "$root/ai/tools/action-timeline/append.sh" ]]; then
    "$root/ai/tools/action-timeline/append.sh" \
      --type "$event_type" \
      --status "$status" \
      --action "$action" \
      --message "$message" >/dev/null 2>&1 || true
  fi
}
