app_name := "dbyaml"

# list all available recipes
[default, group('info')]
@list:
  just --list --unsorted

# interactive recipe selection
[group('info')]
@select:
  just --choose

prelude := '''
  #!/bin/sh
  set -euo pipefail
  if ! test ":$PATH:" = *":$(pwd)/.venv/bin:"* ; then
    export PATH="${UV_PROJECT:-$(pwd)}/.venv/bin:$PATH"
  fi
'''

# installed package version
[group('info')]
[script]
version cmd=app_name:
  {{prelude}}
  {{cmd}} --version

# run checkers
[parallel, group('dev')]
ci-check: test format-check lint-check type-check schema-check

# run fixes
[parallel, group('dev')]
ci-fix: format-fix lint-fix type-fix

# run generators (docs)
[parallel, group('dev')]
ci-gen: docs

# setup virtual environment
[group('install')]
@venv:
  [ -d .venv ] || uv venv

# install core environment
[group('install')]
@install-core: venv
  echo "install venv core"
  uv sync --no-dev

# install dev environment
[group('install')]
@install-dev: venv
  echo "install venv dev"
  uv sync

# run tests
[group('dev')]
@test:
  echo "running tests; pytest (Python)"
  uv run pytest

# check formatting
[group('dev')]
@format-check:
  echo "running formatter; ruff (Python)"
  uv run --only-group=check ruff format --diff .

  echo "running formatter; yamlfmt (YAML)"
  uv run yamlfmt -lint -quiet -output_format default -formatter indent=2,indentless_arrays=true,retain_line_breaks_single=true,trim_trailing_whitespace=true .

# fix formatting
[group('dev')]
@format-fix:
  echo "running formatter; ruff (Python)"
  uv run --only-group=check ruff format .

  # TODO: yaml files

# check linting
[group('dev')]
@lint-check:
  echo "running linter; ruff (Python)"
  uv run --only-group=check ruff check --diff .

# fix linting
[group('dev')]
@lint-fix:
  echo "running linter; ruff (Python)"
  uv run --only-group=check ruff check .

# check typing
[group('dev')]
@type-check:
  echo "running type-checker; ty (Python)"
  uv run --only-group=check ty check .

  echo "running validator; validate-pyproject (Python)"
  uv run validate-pyproject pyproject.toml

  echo "running checker; shellcheck (shell)"
  shellcheck scripts/*.sh

  echo "running spell-checker: typos"
  uv run --only-group=check typos

# fix typing
[group('dev')]
@type-fix:
  echo "running type-checker; ty (Python)"
  uv run --only-group=check ty check --fix .

  echo "running checker; shellcheck (shell)"
  shellcheck scripts/*.sh
  # TODO: run fix

  echo "running spell-checker: typos"
  uv run --only-group=check typos --write-changes

# check project schema
[group('dev')]
@schema-check:
  echo "running schema checker (dbyaml config)"
  uv run scripts/generate_schema.py | diff - src/dbyaml/resources/dbyaml.schema.json

# generate all docs
[group('dev')]
docs: schema-generate docs-man

# generate project schema
[group('dev')]
@schema-generate:
  echo "running schema checker (dbyaml config)"
  uv run scripts/generate_schema.py --outfile src/dbyaml/resources/dbyaml.schema.json

# generate man pages
[group('dev')]
@docs-man:
  echo "generate man"
  uv run click-man --man-version $(uv version --short) dbyaml
