version: '3'

vars:
  HUGO_CMD: hugo
  NPM_CMD: npm

tasks:
  default:
    desc: Show available tasks
    cmds:
      - task --list

  # Build tasks
  build:
    desc: Build Hugo site
    deps:
      - deps:ensure-npm
      - build:generate-info
    cmds:
      - "{{.HUGO_CMD}} --gc --minify"

  build:dev:
    desc: Build Hugo site for development
    deps:
      - deps:ensure-npm
      - build:generate-info
    cmds:
      - "{{.HUGO_CMD}}"

  build:generate-info:
    desc: Generate build information (git commit, version, etc.)
    sources:
      - .git/HEAD
      - .git/refs/**/*
    generates:
      - data/build_info.json
    cmds:
      - ./scripts/generate-build-info.sh

  serve:
    desc: Start Hugo dev server
    deps:
      - deps:ensure-npm
      - build:generate-info
    cmds:
      - "{{.HUGO_CMD}} server --noHTTPCache"

  clean:
    desc: Clean build artifacts
    cmds:
      - rm -rf public resources/_gen .hugo_build.lock

  # Test tasks
  test:
    desc: Run all tests
    deps:
      - test:build
      - test:markdown
      - test:html
      - likec4:validate

  test:hugo:
    desc: Run Hugo-only tests (markdown, HTML, build)
    deps:
      - test:build
      - test:markdown
      - test:html

  test:full:
    desc: Run all tests including link check (may have errors in legacy content)
    deps:
      - test:build
      - test:markdown
      - test:html
      - test:links
      - likec4:validate

  test:quick:
    desc: Run quick tests (without link check)
    deps:
      - test:build
      - test:markdown
      - likec4:validate

  test:build:
    desc: Test Hugo build
    deps:
      - deps:ensure-npm
      - build:generate-info
    cmds:
      - "{{.HUGO_CMD}} --gc --minify --logLevel info"

  test:markdown:
    desc: Lint markdown files
    deps:
      - deps:ensure-npm
    cmds:
      - "{{.NPM_CMD}} run test:markdown"

  test:html:
    desc: Validate HTML
    deps:
      - deps:ensure-npm
    cmds:
      - "{{.NPM_CMD}} run test:html"

  test:links:
    desc: Check links (skips legacy content)
    cmds:
      - |
        # Move legacy dirs outside public temporarily
        mkdir -p /tmp/htmltest-backup-$$
        if [ -d "public/docs-old" ]; then mv public/docs-old /tmp/htmltest-backup-$$/; fi
        if [ -d "public/blog" ]; then mv public/blog /tmp/htmltest-backup-$$/; fi
        if [ -d "public/_print/docs-old" ]; then mv public/_print/docs-old /tmp/htmltest-backup-$$/docs-old-print; fi

        # Run htmltest
        htmltest || EXIT_CODE=$?

        # Restore directories
        if [ -d "/tmp/htmltest-backup-$$/docs-old" ]; then mv /tmp/htmltest-backup-$$/docs-old public/; fi
        if [ -d "/tmp/htmltest-backup-$$/blog" ]; then mv /tmp/htmltest-backup-$$/blog public/; fi
        if [ -d "/tmp/htmltest-backup-$$/docs-old-print" ]; then mv /tmp/htmltest-backup-$$/docs-old-print public/_print/docs-old; fi
        rm -rf /tmp/htmltest-backup-$$

        # Exit with the original exit code
        exit ${EXIT_CODE:-0}

  # LikeC4 tasks
  likec4:generate:
    desc: Generate LikeC4 webcomponent (includes all architecture projects)
    cmds:
      - npx likec4 codegen webcomponent --webcomponent-prefix likec4 --outfile static/js/likec4-webcomponent.js resources/edp-likec4 resources/doc-likec4

  likec4:validate:
    desc: Validate LikeC4 models
    cmds:
      - echo "Validating EDP architecture models..."
      - npx likec4 validate --ignore-layout resources/edp-likec4
      - echo "Validating Documentation platform models..."
      - npx likec4 validate --ignore-layout resources/doc-likec4
      - echo "✓ All LikeC4 models validated successfully"

  likec4:validate:layout:
    desc: Validate LikeC4 models including layout
    cmds:
      - echo "Validating EDP architecture models (including layout)..."
      - npx likec4 validate resources/edp-likec4
      - echo "Validating Documentation platform models (including layout)..."
      - npx likec4 validate resources/doc-likec4
      - echo "✓ All LikeC4 models and layouts validated successfully"

  likec4:update:
    desc: Update LikeC4 to latest version
    cmds:
      - npm update likec4 --prefix resources/edp-likec4
      - npm update likec4 --prefix resources/doc-likec4
      - echo "✓ LikeC4 updated in both projects"

  # Development tasks
  deps:ensure-npm:
    desc: Ensure npm dependencies are installed
    sources:
      - package.json
      - package-lock.json
    generates:
      - node_modules/.package-lock.json
    cmds:
      - "{{.NPM_CMD}} ci"
    status:
      - test -d node_modules

  deps:install:
    desc: Install all dependencies
    cmds:
      - "{{.NPM_CMD}} ci"
      - "{{.HUGO_CMD}} mod get -u"
      - "{{.HUGO_CMD}} mod tidy"

  deps:update:
    desc: Update dependencies
    cmds:
      - devbox update
      - "{{.NPM_CMD}} update"
      - "{{.HUGO_CMD}} mod get -u"

  # CI/CD
  ci:
    desc: Run CI pipeline locally
    deps:
      - test

  build:oci-image:
    desc: Build OCI/Docker image with versions from .env.versions
    cmds:
      - |
        set -a
        source .env.versions
        set +a
        echo "Building OCI image with versions:"
        echo "  NODE_VERSION=${NODE_VERSION}"
        echo "  GO_VERSION=${GO_VERSION}"
        echo "  HUGO_VERSION=${HUGO_VERSION}"
        docker build --network=host \
          --build-arg NODE_VERSION=${NODE_VERSION} \
          --build-arg GO_VERSION=${GO_VERSION} \
          --build-arg HUGO_VERSION=${HUGO_VERSION} \
          -t ipceicis-developerframework:latest \
          -t ipceicis-developerframework:$(git rev-parse --short HEAD) \
          .

  test:oci-image:
    desc: Test the built OCI image
    deps:
      - build:oci-image
    cmds:
      - |
        echo "Starting container on port 8080..."
        docker run -d -p 8080:80 --name hugo-test ipceicis-developerframework:latest
        sleep 2
        echo "Testing endpoint..."
        curl -f http://localhost:8080 > /dev/null && echo "✓ Container is running and responding" || echo "✗ Container test failed"
        echo "Cleaning up..."
        docker stop hugo-test
        docker rm hugo-test
