version: '3'

vars:
  # SemVer 2.0.0 build variables
  SEMVER_TAG:
    sh: git describe --tags --abbrev=0 2>/dev/null || echo "0.0.0"
  SEMVER_VERSION:
    sh: echo "{{.SEMVER_TAG}}" | sed 's/^v//'
  SEMVER_COMMITS:
    sh: git rev-list {{.SEMVER_TAG}}..HEAD --count 2>/dev/null || echo "0"
  SEMVER_COMMIT:
    sh: git rev-parse --short HEAD 2>/dev/null || echo "unknown"
  SEMVER_DATE:
    sh: date -u +%Y%m%d
  SEMVER_PRERELEASE:
    sh: '[ "{{.SEMVER_COMMITS}}" = "0" ] && echo "" || echo "dev.{{.SEMVER_COMMITS}}"'
  # ldflags
  PKG: "forge.lthn.ai/core/go/pkg/cli"
  LDFLAGS_BASE: >-
    -X {{.PKG}}.AppVersion={{.SEMVER_VERSION}}
    -X {{.PKG}}.BuildCommit={{.SEMVER_COMMIT}}
    -X {{.PKG}}.BuildDate={{.SEMVER_DATE}}
    -X {{.PKG}}.BuildPreRelease={{.SEMVER_PRERELEASE}}
  # Development build: includes debug info
  LDFLAGS: "{{.LDFLAGS_BASE}}"
  # Release build: strips debug info and symbol table for smaller binary
  LDFLAGS_RELEASE: "-s -w {{.LDFLAGS_BASE}}"
  # Compat alias
  VERSION:
    sh: git describe --tags --exact-match 2>/dev/null || echo "dev"

tasks:
  # --- CLI Management ---
  cli:build:
    desc: "Build core CLI to ./bin/core (dev build with debug info)"
    cmds:
      - go build -ldflags '{{.LDFLAGS}}' -o ./bin/core .

  cli:build:release:
    desc: "Build core CLI for release (smaller binary, no debug info)"
    cmds:
      - go build -ldflags '{{.LDFLAGS_RELEASE}}' -o ./bin/core .

  cli:install:
    desc: "Install core CLI to system PATH (dev build)"
    cmds:
      - go install -ldflags '{{.LDFLAGS}}' .

  cli:install:release:
    desc: "Install core CLI for release (smaller binary)"
    cmds:
      - go install -ldflags '{{.LDFLAGS_RELEASE}}' .

  # --- Development ---
  test:
    desc: "Run all tests"
    cmds:
      - core test

  test:verbose:
    desc: "Run all tests with verbose output"
    cmds:
      - core test --verbose

  test:run:
    desc: "Run specific test (use: task test:run -- TestName)"
    cmds:
      - core test --run {{.CLI_ARGS}}

  cov:
    desc: "Run tests with coverage report"
    cmds:
      - core go cov

  cov-view:
    desc: "Open HTML coverage report"
    cmds:
      - core go cov --open

  fmt:
    desc: "Format Go code"
    cmds:
      - core go fmt

  lint:
    desc: "Run linter"
    cmds:
      - core go lint

  mod:tidy:
    desc: "Run go mod tidy"
    cmds:
      - core go mod tidy

  # --- Quality Assurance ---
  qa:
    desc: "Run QA: fmt, vet, lint, test"
    cmds:
      - core go qa

  qa:quick:
    desc: "Quick QA: fmt, vet, lint only"
    cmds:
      - core go qa quick

  qa:full:
    desc: "Full QA: + race, vuln, security"
    cmds:
      - core go qa full

  qa:fix:
    desc: "QA with auto-fix"
    cmds:
      - core go qa --fix

  # --- Build ---
  build:
    desc: "Build project with auto-detection"
    cmds:
      - core build

  build:ci:
    desc: "Build for CI (all targets, checksums)"
    cmds:
      - core build --ci

  # --- Environment ---
  doctor:
    desc: "Check development environment"
    cmds:
      - core doctor

  doctor:verbose:
    desc: "Check environment with details"
    cmds:
      - core doctor --verbose

  # --- Code Review ---
  review:
    desc: "Run CodeRabbit review"
    cmds:
      - coderabbit review --prompt-only

  check:
    desc: "Tidy, test, and review"
    cmds:
      - task: mod:tidy
      - task: test
      - task: review

  # --- i18n ---
  i18n:generate:
    desc: "Regenerate i18n key constants"
    cmds:
      - go generate ./pkg/i18n/...

  i18n:validate:
    desc: "Validate i18n key usage"
    cmds:
      - go run ./internal/tools/i18n-validate ./...

  # --- Core IDE (Wails v3) ---
  ide:dev:
    desc: "Run Core IDE in Wails dev mode"
    dir: cmd/core-ide
    cmds:
      - cd frontend && npm install && npm run build
      - wails3 dev

  ide:build:
    desc: "Build Core IDE production binary"
    dir: cmd/core-ide
    cmds:
      - cd frontend && npm install && npm run build
      - wails3 build

  ide:frontend:
    desc: "Build Core IDE frontend only"
    dir: cmd/core-ide/frontend
    cmds:
      - npm install
      - npm run build

  # --- Core App (FrankenPHP + Wails v3) ---
  app:setup:
    desc: "Install PHP-ZTS build dependency for Core App"
    cmds:
      - brew tap shivammathur/php 2>/dev/null || true
      - brew install shivammathur/php/php@8.4-zts

  app:composer:
    desc: "Install Laravel dependencies for Core App"
    dir: cmd/core-app/laravel
    cmds:
      - composer install --no-dev --optimize-autoloader --no-interaction

  app:build:
    desc: "Build Core App (FrankenPHP + Laravel desktop binary)"
    dir: cmd/core-app
    env:
      CGO_ENABLED: "1"
      CGO_CFLAGS:
        sh: /opt/homebrew/opt/php@8.4-zts/bin/php-config --includes
      CGO_LDFLAGS:
        sh: "echo -L/opt/homebrew/opt/php@8.4-zts/lib $(/opt/homebrew/opt/php@8.4-zts/bin/php-config --ldflags) $(/opt/homebrew/opt/php@8.4-zts/bin/php-config --libs)"
    cmds:
      - go build -tags nowatcher -o ../../bin/core-app .

  app:dev:
    desc: "Build and run Core App"
    dir: cmd/core-app
    env:
      CGO_ENABLED: "1"
      CGO_CFLAGS:
        sh: /opt/homebrew/opt/php@8.4-zts/bin/php-config --includes
      CGO_LDFLAGS:
        sh: "echo -L/opt/homebrew/opt/php@8.4-zts/lib $(/opt/homebrew/opt/php@8.4-zts/bin/php-config --ldflags) $(/opt/homebrew/opt/php@8.4-zts/bin/php-config --libs)"
      DYLD_LIBRARY_PATH: "/opt/homebrew/opt/php@8.4-zts/lib"
    cmds:
      - go build -tags nowatcher -o ../../bin/core-app .
      - ../../bin/core-app

  # --- BugSETI (Wails v3 System Tray) ---
  bugseti:dev:
    desc: "Build and run BugSETI (production binary with embedded frontend)"
    dir: cmd/bugseti
    cmds:
      - cd frontend && npm install && npm run build
      - go build -buildvcs=false -o ../../bin/bugseti .
      - ../../bin/bugseti

  bugseti:build:
    desc: "Build BugSETI production binary"
    dir: cmd/bugseti
    cmds:
      - cd frontend && npm install && npm run build
      - go build -trimpath -buildvcs=false -ldflags="-w -s" -o ../../bin/bugseti .

  bugseti:frontend:
    desc: "Build BugSETI frontend only"
    dir: cmd/bugseti/frontend
    cmds:
      - npm install
      - npm run build

  # --- Multi-repo (when in workspace) ---
  dev:health:
    desc: "Check health of all repos"
    cmds:
      - core dev health

  dev:work:
    desc: "Full workflow: status, commit, push"
    cmds:
      - core dev work

  dev:status:
    desc: "Show status of all repos"
    cmds:
      - core dev work --status
