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

ROOT=$(git rev-parse --show-toplevel 2>/dev/null || pwd)
cd "$ROOT"

failures=0

fail() {
  printf 'FAIL: %s\n' "$1" >&2
  failures=$((failures + 1))
}

is_kebab() {
  [[ "$1" =~ ^[a-z0-9]+(-[a-z0-9]+)*$ ]]
}

frontmatter_field() {
  local file="$1"
  local field="$2"
  awk -v field="$field" '
    NR == 1 {
      if ($0 != "---") {
        exit
      }
      next
    }
    $0 == "---" {
      exit
    }
    index($0, field ":") == 1 {
      sub("^[^:]+:[[:space:]]*", "")
      print
      exit
    }
  ' "$file"
}

[[ -d skills ]] || fail "repo-owned skills directory is missing: skills/"

while IFS= read -r entry; do
  fail "skills/ must contain only skill directories, found file: $entry"
done < <(find skills -mindepth 1 -maxdepth 1 -type f | sort)

while IFS= read -r skill_dir; do
  skill_name=${skill_dir#skills/}
  skill_file="$skill_dir/SKILL.md"

  is_kebab "$skill_name" || fail "$skill_dir must use lowercase kebab-case"
  [[ -f "$skill_file" ]] || fail "$skill_dir must contain SKILL.md"

  if [[ -f "$skill_file" ]]; then
    first_line=$(sed -n '1p' "$skill_file")
    [[ "$first_line" == "---" ]] || fail "$skill_file must start with YAML frontmatter"

    closing_line=$(awk 'NR > 1 && $0 == "---" { print NR; exit }' "$skill_file")
    [[ -n "$closing_line" ]] || fail "$skill_file must close YAML frontmatter"

    declared_name=$(frontmatter_field "$skill_file" name)
    description=$(frontmatter_field "$skill_file" description)

    [[ -n "$declared_name" ]] || fail "$skill_file must declare frontmatter name"
    [[ "$declared_name" == "$skill_name" ]] || fail "$skill_file frontmatter name must match directory name: $declared_name != $skill_name"
    [[ -n "$description" ]] || fail "$skill_file must declare frontmatter description"
  fi
done < <(find skills -mindepth 1 -maxdepth 1 -type d | sort)

while IFS= read -r nested_skill; do
  [[ "$nested_skill" =~ ^skills/[a-z0-9]+(-[a-z0-9]+)*/SKILL\.md$ ]] || fail "SKILL.md must live at skills/{skill-name}/SKILL.md: $nested_skill"
done < <(find skills -mindepth 2 -type f -name SKILL.md | sort)

while IFS= read -r doc; do
  fail "skill auxiliary docs are not allowed; keep skill context in SKILL.md or referenced resources: $doc"
done < <(find skills -mindepth 2 -type f \( -iname README.md -o -iname CHANGELOG.md -o -iname INSTALLATION_GUIDE.md -o -iname QUICK_REFERENCE.md \) | sort)

if (( failures > 0 )); then
  printf '\nRepository skill layout guardrail failed with %d issue(s).\n' "$failures" >&2
  exit 1
fi

printf 'Repository skill layout guardrail passed.\n'
