# https://github.com/casey/just
# Setup
set export
set positional-arguments
set dotenv-load

# Variables
PACKAGE_NAME := `cargo metadata --format-version 1 --no-deps | jq '.packages[0].name'`
PACKAGE_VERSION := `cargo metadata --format-version 1 --no-deps | jq '.packages[0].version'`
# gitlab container registry
REGISTRY_URL := 'registry.gitlab.com/caratland4/ue/crl5-service-ue'
# local microservice port
DEFAULT_PORT := '8080'
# telepresence into targetted remote container port
TP_CONTAINER_PORT := '8080'
# used by telepresence
K8S_DEV_NAMESPACE :='rust-dev'
# used by telepresence
K8S_DEV_CONTEXT :='k3d-crl5-dev0'

# Commands
# Initialize configs for project's git commands
init-git:
  git config --global push.followTags true
  git flow init
  jq --version
  loc --version

# Start default development environment
dev: dev-tp dev-local

# Start local development environment
@dev-local:
  RUST_LOG=debug cargo watch -i *.log -x run

# Commit and push
@dev-commit COMMIT_MESSAGE:
  cargo fmt
  cargo clippy
  git commit -am "{{COMMIT_MESSAGE}}"
  git tag -a v{{PACKAGE_VERSION}} -m "{{COMMIT_MESSAGE}}"
  cargo set-version --bump patch
  git push origin develop
  loc
# glab ci status --live

@publish-dry:
  cargo publish --dry-run --allow-dirty

@publish:
  cargo publish --allow-dirty

# Setup multi-platform builder
@docker-build-prep:
  docker buildx ls
  docker buildx create --use
  docker buildx inspect --bootstrap

# Build and push to container registry
@docker-build-push:
  docker buildx build --platform linux/amd64 \
  --cache-from {{REGISTRY_URL}}:latest \
  --build-arg BUILDKIT_INLINE_CACHE=1 \
  --build-arg DOCKER_BUILDKIT=1 \
  --tag {{REGISTRY_URL}}:latest \
  --tag {{REGISTRY_URL}}:{{PACKAGE_VERSION}} \
  --progress=plain \
  --push .
# docker buildx build --platform linux/amd64,linux/arm64 \

# Prune unused docker images
@dev-clean:
  echo 'y' | docker system prune

# Run container locally
@dev-run:
  docker container run -p {{DEFAULT_PORT}}:{{DEFAULT_PORT}} {{REGISTRY_URL}}:latest

# Deploy to development cluster
@dev-deploy:
  kubectl apply -f manifests/network
  kubectl apply -f manifests/package

# Remove deployment to development cluster
@dev-undeploy:
  kubectl delete -f manifests/package

# Deploy Redis cluster to development cluster
@dev-redis:
  kubectl apply -f manifests/redis

# Dive into container shell for debugging
dev-exec:
  docker exec -it {{REGISTRY_URL}}:latest /bin/sh

# Start telepresence development into remote kubernetes cluster
@dev-tp:
  kubectx {{K8S_DEV_CONTEXT}}
  telepresence connect
  kubens {{K8S_DEV_NAMESPACE}}
  telepresence list
  telepresence intercept {{PACKAGE_NAME}} --port {{DEFAULT_PORT}}:{{TP_CONTAINER_PORT}}
  telepresence status

# Leave telepresence session and remove agents
@dev-tp-clean:
  kubectx {{K8S_DEV_CONTEXT}}
  kubens {{K8S_DEV_NAMESPACE}}
  telepresence status
  telepresence leave {{PACKAGE_NAME}}
  telepresence uninstall --agent {{PACKAGE_NAME}} --namespace {{K8S_DEV_NAMESPACE}}
  telepresence quit

# Gitlab merge request to Stage branch
@stage-mr MR_MESSAGE:
  glab mr create --fill --fill-commit-body --source-branch develop --target-branch stage --assignee me --web --title "{{MR_MESSAGE}}"

# Gitlab merge request to Production branch
@prod-mr MR_MESSAGE:
  glab mr create --fill --fill-commit-body --source-branch stage --target-branch prod --assignee me --web --title "{{MR_MESSAGE}}"

# Install tools in CI
ci-install:
  cargo install just
  cargo install cargo-metadata

# Test in CI
ci-test:
  cargo test

# Output .version file for CI
ci-version:
  echo {{PACKAGE_VERSION}} > .version

# Lint source code
@lint:
  cargo clippy

# Build for release
@build:
  cargo build --release

# Semantic version bump up patch
@sv-patch:
  cargo set-version --bump patch

# Semantic version bump up minor
@sv-minor:
  cargo set-version --bump minor

# Semantic version bump up major
@sv-major:
  cargo set-version --bump major

# Output package version
@pkg-ver:
  @echo {{PACKAGE_VERSION}}

# Cargo test
# https://nexte.st/book/usage.html
@test:
  RUST_LOG=info cargo watch -d 2 -x "nextest run --test-threads=1"

# Cargo documentation
@doc:
  cargo doc --open

# List possible commands
@default:
  echo "List of commands"
  just --list
