name: 'Changed Files Check'
description: 'Detect changed files using filters.yaml and check for uncovered files'

inputs:
  gh_token:
    description: 'GitHub token for PR API calls'
    required: true

outputs:
  core:
    description: 'Whether core files changed'
    value: ${{ steps.filter.outputs.core_any_modified }}
  operator:
    description: 'Whether operator files changed'
    value: ${{ steps.filter.outputs.operator_any_modified }}
  deploy:
    description: 'Whether deploy files changed'
    value: ${{ steps.filter.outputs.deploy_any_modified }}
  vllm:
    description: 'Whether vllm files changed'
    value: ${{ steps.filter.outputs.vllm_any_modified }}
  sglang:
    description: 'Whether sglang files changed'
    value: ${{ steps.filter.outputs.sglang_any_modified }}
  trtllm:
    description: 'Whether trtllm files changed'
    value: ${{ steps.filter.outputs.trtllm_any_modified }}
  frontend:
    description: 'Whether frontend files changed'
    value: ${{ steps.filter.outputs.frontend_any_modified }}
  rust:
    description: 'Whether rust files changed'
    value: ${{ steps.filter.outputs.rust_any_modified }}

runs:
  using: "composite"
  steps:
    - name: Get merge base
      id: merge-base
      shell: bash
      env:
        GH_TOKEN: ${{ inputs.gh_token }}
      run: |
        # For PR branches, compare against merge-base with PR's target branch
        # For main/release branches, use default behavior (previous commit)
        if [[ "${{ github.ref_name }}" =~ ^pull-request/([0-9]+)$ ]]; then
          PR_NUMBER="${BASH_REMATCH[1]}"
          BASE_BRANCH=$(gh pr view "$PR_NUMBER" --json baseRefName -q '.baseRefName')
          echo "PR #$PR_NUMBER targets branch: $BASE_BRANCH"
          BASE_SHA=$(git merge-base "origin/$BASE_BRANCH" HEAD)
          echo "base_sha=$BASE_SHA" >> $GITHUB_OUTPUT
          echo "Using merge-base with $BASE_BRANCH: $BASE_SHA"
        else
          echo "base_sha=" >> $GITHUB_OUTPUT
          echo "Using default comparison (previous commit)"
        fi

    - name: Check for changes
      uses: tj-actions/changed-files@aa08304bd477b800d468db44fe10f6c61f7f7b11  # v42.1.0
      id: filter
      with:
        files_yaml_from_source_file: .github/filters.yaml
        base_sha: ${{ steps.merge-base.outputs.base_sha }}

    - name: Debug changed files
      shell: bash
      run: |
        echo "=== Base SHA Used ==="
        echo "base_sha: ${{ steps.merge-base.outputs.base_sha || 'default (previous commit)' }}"
        echo ""
        echo "=== All Modified Files (${{ steps.filter.outputs.all_all_modified_files_count }} total) ==="
        echo "${{ steps.filter.outputs.all_all_modified_files }}"
        echo ""
        echo "=== Filters That Matched ==="
        echo "changed_keys: ${{ steps.filter.outputs.changed_keys }}"
        echo ""
        echo "=== Filter Results ==="
        echo "docs: ${{ steps.filter.outputs.docs_any_modified }}"
        echo "ci: ${{ steps.filter.outputs.ci_any_modified }}"
        echo "core: ${{ steps.filter.outputs.core_any_modified }}"
        echo "operator: ${{ steps.filter.outputs.operator_any_modified }}"
        echo "deploy: ${{ steps.filter.outputs.deploy_any_modified }}"
        echo "planner: ${{ steps.filter.outputs.planner_any_modified }}"
        echo "vllm: ${{ steps.filter.outputs.vllm_any_modified }}"
        echo "sglang: ${{ steps.filter.outputs.sglang_any_modified }}"
        echo "trtllm: ${{ steps.filter.outputs.trtllm_any_modified }}"
        echo "frontend: ${{ steps.filter.outputs.frontend_any_modified }}"
        echo "rust: ${{ steps.filter.outputs.rust_any_modified }}"
        echo ""
        echo "=== Files Matching Each Filter ==="
        echo "docs: ${{ steps.filter.outputs.docs_all_modified_files }}"
        echo "ci: ${{ steps.filter.outputs.ci_all_modified_files }}"
        echo "core: ${{ steps.filter.outputs.core_all_modified_files }}"
        echo "operator: ${{ steps.filter.outputs.operator_all_modified_files }}"
        echo "deploy: ${{ steps.filter.outputs.deploy_all_modified_files }}"
        echo "planner: ${{ steps.filter.outputs.planner_all_modified_files }}"
        echo "vllm: ${{ steps.filter.outputs.vllm_all_modified_files }}"
        echo "sglang: ${{ steps.filter.outputs.sglang_all_modified_files }}"
        echo "trtllm: ${{ steps.filter.outputs.trtllm_all_modified_files }}"
        echo "frontend: ${{ steps.filter.outputs.frontend_all_modified_files }}"
        echo "rust: ${{ steps.filter.outputs.rust_all_modified_files }}"

    - name: Check for uncovered files
      shell: bash
      run: |
        # Combine all filter-specific files into one list
        COVERED_FILES=$(echo "${{ steps.filter.outputs.docs_all_modified_files }} ${{ steps.filter.outputs.examples_all_modified_files }} ${{ steps.filter.outputs.ignore_all_modified_files }} ${{ steps.filter.outputs.ci_all_modified_files }} ${{ steps.filter.outputs.core_all_modified_files }} ${{ steps.filter.outputs.operator_all_modified_files }} ${{ steps.filter.outputs.deploy_all_modified_files }} ${{ steps.filter.outputs.planner_all_modified_files }} ${{ steps.filter.outputs.vllm_all_modified_files }} ${{ steps.filter.outputs.sglang_all_modified_files }} ${{ steps.filter.outputs.trtllm_all_modified_files }} ${{ steps.filter.outputs.frontend_all_modified_files }} ${{ steps.filter.outputs.rust_all_modified_files }}" | tr ' ' '\n' | grep -v '^$' | sort -u)

        # Get all modified files
        ALL_FILES=$(echo "${{ steps.filter.outputs.all_all_modified_files }}" | tr ' ' '\n' | grep -v '^$' | sort -u)

        # Find files in ALL but not in COVERED
        UNCOVERED=$(comm -23 <(echo "$ALL_FILES") <(echo "$COVERED_FILES"))

        if [ -n "$UNCOVERED" ]; then
          echo "::error::The following files are not covered by any CI filter:"
          echo "$UNCOVERED"
          echo ""
          echo "Please add these paths to .github/filters.yaml"
          echo "See .github/FILTERS.md for documentation"
          exit 1
        fi
        echo "All modified files are covered by CI filters."

