name: timelord
description: |
  Use timelord to set file timestamps with git-warp-time fallback for cache misses
inputs:
  key:
    description: |
      The key to use for caching the timelord data.
    required: false
    default: ''
  path:
    description: |
      The path to the directory to be timestamped.
    required: false
    default: ''

outputs:
  database-path:
    description: Path to timelord database
    value: '${{ env.TIMELORD_CACHE_PATH }}'

runs:
  using: composite
  steps:
    - name: Set defaults
      shell: bash
      run: |
        echo "TIMELORD_KEY=${{ inputs.key || format('timelord-v1-{0}-{1}', github.repository, hashFiles('**/*.rs', '**/Cargo.toml', '**/Cargo.lock')) }}" >> $GITHUB_ENV
        echo "TIMELORD_PATH=${{ inputs.path || '.' }}" >> $GITHUB_ENV
        echo "TIMELORD_CACHE_PATH=$HOME/.cache/timelord" >> $GITHUB_ENV
        echo "PATH=$HOME/.cargo/bin:/usr/share/rust/.cargo/bin:$PATH" >> $GITHUB_ENV

    - name: Restore binary cache
      id: binary-cache
      uses: actions/cache/restore@v4
      with:
        path: |
          /usr/share/rust/.cargo/bin
          ~/.cargo/bin
        key: continuwuity-timelord-binaries

    - name: Check if binaries need installation
      shell: bash
      id: check-binaries
      run: |
        NEED_INSTALL=false

        # Ensure ~/.cargo/bin exists
        mkdir -p ~/.cargo/bin

        # Check and move timelord if needed
        if [ -f /usr/share/rust/.cargo/bin/timelord ] && [ ! -f ~/.cargo/bin/timelord ]; then
          echo "Moving timelord from /usr/share/rust/.cargo/bin to ~/.cargo/bin"
          mv /usr/share/rust/.cargo/bin/timelord ~/.cargo/bin/
        fi
        if [ ! -f ~/.cargo/bin/timelord ]; then
          echo "timelord-cli not found, needs installation"
          NEED_INSTALL=true
        fi

        # Check and move git-warp-time if needed
        if [ -f /usr/share/rust/.cargo/bin/git-warp-time ] && [ ! -f ~/.cargo/bin/git-warp-time ]; then
          echo "Moving git-warp-time from /usr/share/rust/.cargo/bin to ~/.cargo/bin"
          mv /usr/share/rust/.cargo/bin/git-warp-time ~/.cargo/bin/
        fi
        if [ ! -f ~/.cargo/bin/git-warp-time ]; then
          echo "git-warp-time not found, needs installation"
          NEED_INSTALL=true
        fi

        echo "need-install=$NEED_INSTALL" >> $GITHUB_OUTPUT

    - name: Install timelord-cli and git-warp-time
      if: steps.check-binaries.outputs.need-install == 'true'
      uses: https://github.com/taiki-e/install-action@v2
      with:
        tool: git-warp-time,timelord-cli@3.0.1

    - name: Save binary cache
      if: steps.check-binaries.outputs.need-install == 'true'
      uses: actions/cache/save@v4
      with:
        path: |
          /usr/share/rust/.cargo/bin
          ~/.cargo/bin
        key: continuwuity-timelord-binaries


    - name: Restore timelord cache with fallbacks
      id: timelord-restore
      uses: actions/cache/restore@v4
      with:
        path: ${{ env.TIMELORD_CACHE_PATH }}
        key: ${{ env.TIMELORD_KEY }}
        restore-keys: |
          continuwuity-timelord-${{ github.repository }}-

    - name: Initialize timestamps on complete cache miss
      if: steps.timelord-restore.outputs.cache-hit != 'true'
      shell: bash
      run: |
        echo "Complete timelord cache miss - running git-warp-time"
        git fetch --unshallow
        if [ "${{ env.TIMELORD_PATH }}" = "." ]; then
          git-warp-time --quiet
        else
          git-warp-time --quiet ${{ env.TIMELORD_PATH }}
        fi
        echo "Git timestamps restored"

    - name: Run timelord sync
      shell: bash
      run: |
        mkdir -p ${{ env.TIMELORD_CACHE_PATH }}
        timelord sync --source-dir ${{ env.TIMELORD_PATH }} --cache-dir ${{ env.TIMELORD_CACHE_PATH }}

    - name: Save updated timelord cache immediately
      uses: actions/cache/save@v4
      with:
        path: ${{ env.TIMELORD_CACHE_PATH }}
        key: ${{ env.TIMELORD_KEY }}
