name: Deploy

on:
  workflow_call:
    inputs:
      framework: 
        description: '.net framework'
        type: string
        required: true
      branch:
        description: 'Git branch used for this build'
        type: string
        required: true
      major_version:
        description: 'Sonarr major version'
        type: string
        required: true
      version:
        description: 'Sonarr version'
        type: string
        required: true
    secrets:
      SERVICES_API_KEY:
        required: true

jobs:
  package:
    strategy:
      matrix:
        platform: [freebsd, linux, macos, windows]
        include:
          - platform: freebsd
            os: ubuntu-latest
          - platform: linux
            os: ubuntu-latest
          - platform: macos
            os: ubuntu-latest
          - platform: windows
            os: windows-latest

    runs-on: ${{ matrix.os }}
    steps:
    - name: Check out
      uses: actions/checkout@v4

    - name: Package
      uses: ./.github/actions/package
      with:
        framework: ${{ inputs.framework }}
        platform: ${{ matrix.platform }}
        artifact: build_${{ matrix.platform }}
        branch: ${{ inputs.branch }}
        major_version: ${{ inputs.major_version }}
        version: ${{ inputs.version }}

  release:
    needs: package
    runs-on: ubuntu-latest
    permissions:
      contents: write
    steps:
    - name: Check out
      uses: actions/checkout@v4

    - name: Download release artifacts
      uses: actions/download-artifact@v4
      with:
        path: _artifacts
        pattern: release_*
        merge-multiple: true

    - name: Get Previous Release
      id: previous-release
      uses: cardinalby/git-get-release-action@v1
      env:
        GITHUB_TOKEN: ${{ github.token }}
      with:
        latest: true
        prerelease: ${{ inputs.branch != 'main' }}

    - name: Generate Release Notes
      id: generate-release-notes
      uses: actions/github-script@v7
      with:
        github-token: ${{ github.token }}
        result-encoding: string
        script: |
          const { data } = await github.rest.repos.generateReleaseNotes({
            owner: context.repo.owner,
            repo: context.repo.repo,
            tag_name: 'v${{ inputs.version }}',
            target_commitish: '${{ github.sha }}',
            previous_tag_name: '${{ steps.previous-release.outputs.tag_name }}',
          })
          return data.body

    - name: Create release
      uses: ncipollo/release-action@v1
      with:
        artifacts: _artifacts/Sonarr.*
        commit: ${{ github.sha }}
        generateReleaseNotes: false
        body: ${{ steps.generate-release-notes.outputs.result }}
        name: ${{ inputs.version }}
        prerelease: ${{ inputs.branch != 'main' }}
        skipIfReleaseExists: true
        tag: v${{ inputs.version }}

    - name: Publish to Services
      shell: bash
      working-directory: _artifacts
      run: |
        branch=${{ inputs.branch }}
        version=${{ inputs.version }}
        lastCommit=${{ github.sha }}
        
        hashes="["
        
        addHash() {
          path=$1
          os=$2
          arch=$3
          type=$4
        
          local hash=$(sha256sum *.$version.$path | awk '{ print $1; }')
          echo "{ \""Os\"": \""$os\"", \""Arch\"": \""$arch\"", \""Type\"": \""$type\"", \""Hash\"": \""$hash\"" }"
        }
        
        hashes="$hashes $(addHash "linux-arm.tar.gz" "linux" "arm" "archive")"
        hashes="$hashes, $(addHash "linux-arm64.tar.gz" "linux" "arm64" "archive")"
        hashes="$hashes, $(addHash "linux-x64.tar.gz" "linux" "x64" "archive")"
        # hashes="$hashes, $(addHash "linux-x86.tar.gz" "linux" "x86" "archive")"
        
        # hashes="$hashes, $(addHash "linux-musl-arm.tar.gz" "linuxmusl" "arm" "archive")"
        hashes="$hashes, $(addHash "linux-musl-arm64.tar.gz" "linuxmusl" "arm64" "archive")"
        hashes="$hashes, $(addHash "linux-musl-x64.tar.gz" "linuxmusl" "x64" "archive")"
        
        hashes="$hashes, $(addHash "osx-arm64.tar.gz" "osx" "arm64" "archive")"
        hashes="$hashes, $(addHash "osx-x64.tar.gz" "osx" "x64" "archive")"
        
        hashes="$hashes, $(addHash "osx-arm64-app.zip" "osx" "arm64" "installer")"
        hashes="$hashes, $(addHash "osx-x64-app.zip" "osx" "x64" "installer")"
        
        hashes="$hashes, $(addHash "win-x64.zip" "windows" "x64" "archive")"
        hashes="$hashes, $(addHash "win-x86.zip" "windows" "x86" "archive")"
        
        hashes="$hashes, $(addHash "win-x64-installer.exe" "windows" "x64" "installer")"
        hashes="$hashes, $(addHash "win-x86-installer.exe" "windows" "x86" "installer")"
        
        hashes="$hashes, $(addHash "freebsd-x64.tar.gz" "freebsd" "x64" "archive")"
        
        hashes="$hashes ]"
        
        json="{\""branch\"":\""$branch\"", \""version\"":\""$version\"", \""lastCommit\"":\""$lastCommit\"", \""hashes\"":$hashes, \""gitHubRelease\"":true}"
        url="https://services.sonarr.tv/v1/update"
        
        echo "Publishing update $version ($branch) to: $url"
        echo "$json"
        
        curl -H "Content-Type: application/json" -H "X-Api-Key: ${{ secrets.SERVICES_API_KEY }}" -X POST -d "$json" --fail-with-body $url