name: Deploy

on: 
  workflow_dispatch:
    inputs:
      release_tag_name_input:
        description: "Release Tag Name <X.X.X>"
        required: true

jobs:
  setup:
    name: Setup
    runs-on: ubuntu-latest
    outputs:
      package_version: ${{ steps.create_tags.outputs.package_version }}
      tag_version: ${{ steps.create_tags.outputs.tag_version }}
    steps:
      - name: Checkout Repo
        uses: actions/checkout@5a4ac9002d0be2fb38bd78e4b4dbde5606d7042f # v2.3.4

      - name: Create Deploy version vars
        id: create_tags
        run: |
          if ! [[ "${{ github.event_name }}" -eq "release" ]]; then
            case "${RELEASE_TAG_NAME_INPUT:0:1}" in
              v)
                echo "RELEASE_NAME=${RELEASE_TAG_NAME_INPUT:1}" >> $GITHUB_ENV
                echo "RELEASE_TAG_NAME=$RELEASE_TAG_NAME_INPUT" >> $GITHUB_ENV
                echo "::set-output name=package_version::${RELEASE_TAG_NAME_INPUT:1}"
                echo "::set-output name=tag_version::$RELEASE_TAG_NAME_INPUT"
                ;;
              [0-9])
                echo "RELEASE_NAME=$RELEASE_TAG_NAME_INPUT" >> $GITHUB_ENV
                echo "RELEASE_TAG_NAME=v$RELEASE_TAG_NAME_INPUT" >> $GITHUB_ENV
                echo "::set-output name=package_version::$RELEASE_TAG_NAME_INPUT"
                echo "::set-output name=tag_version::v$RELEASE_TAG_NAME_INPUT"
                ;;
              *)
                exit 1
                ;;
            esac
          else
            TAG_VERSION=$(echo ${{ github.ref }} | cut -d "/" -f 3)
            PKG_VERSION=${TAG_VERSION:1}

            echo "::set-output name=package_version::$PKG_VERSION"
            echo "::set-output name=tag_version::$TAG_VERSION"
          fi
        env:
          RELEASE_TAG_NAME_INPUT: ${{ github.event.inputs.release_tag_name_input }}

  snap:
    name: Deploy Snap
    runs-on: ubuntu-latest
    needs: setup
    env:
      PKG_VERSION: ${{ needs.setup.outputs.package_version }}
      TAG_VERSION: ${{ needs.setup.outputs.tag_version }}
    steps:
      - name: Checkout Repo
        uses: actions/checkout@5a4ac9002d0be2fb38bd78e4b4dbde5606d7042f # v2.3.4

      - name: Install Snap
        uses: samuelmeuli/action-snapcraft@10d7d0a84d9d86098b19f872257df314b0bd8e2d # v1.2.0
        with:
          snapcraft_token: ${{ secrets.SNAP_TOKEN }}

      - name: Setup
        run: mkdir dist

      - name: Get Snap package
        uses: Xotl/cool-github-releases@16c58a5863d6ba9944f63ca8bb78bb3249ce1d81 # v1.1.6
        with:
          mode: download
          tag_name: ${{ env.TAG_VERSION }}
          assets: bitwarden_${{ env.PKG_VERSION }}_amd64.snap|./dist/bitwarden_${{ env.PKG_VERSION }}_amd64.snap
          github_token: ${{ secrets.GITHUB_TOKEN }}

      - name: Test
        run: ls -alht dist

      - name: Deploy to Snap Store
        run: |
          snapcraft upload dist/bitwarden_${{ env.PKG_VERSION }}_amd64.snap --release stable
          snapcraft logout

  choco:
    name: Deploy Choco
    runs-on: windows-latest
    needs: setup
    env:
      PKG_VERSION: ${{ needs.setup.outputs.package_version }}
      TAG_VERSION: ${{ needs.setup.outputs.tag_version }}
    steps:
      - name: Checkout Repo
        uses: actions/checkout@5a4ac9002d0be2fb38bd78e4b4dbde5606d7042f # v2.3.4

      - name: Get choco release asset
        uses: Xotl/cool-github-releases@16c58a5863d6ba9944f63ca8bb78bb3249ce1d81 # v1.1.6
        with:
          mode: download
          tag_name: ${{ env.TAG_VERSION }}
          assets: bitwarden.${{ env.PKG_VERSION }}.nupkg
          github_token: ${{ secrets.GITHUB_TOKEN }}

      - name: Setup Chocolatey
        run: choco apikey --key $env:CHOCO_API_KEY --source https://push.chocolatey.org/
        env:
          CHOCO_API_KEY: ${{ secrets.CHOCO_API_KEY }}

      - name: Make dist dir 
        shell: pwsh
        run: New-Item -ItemType directory -Path ./dist

      - name: Get nupkg
        uses: Xotl/cool-github-releases@16c58a5863d6ba9944f63ca8bb78bb3249ce1d81 # v1.1.6
        with:
          mode: download
          tag_name: ${{ env.TAG_VERSION }}
          assets: bitwarden.${{ env.PKG_VERSION }}.nupkg|./dist/bitwarden.${{ env.PKG_VERSION }}.nupkg
          github_token: ${{ secrets.GITHUB_TOKEN }}

      - name: Push to Chocolatey
        shell: pwsh
        run: |
          cd dist
          choco push

  macos:
    name: Deploy MacOS
    runs-on: macos-latest
    needs: setup
    env:
      PKG_VERSION: ${{ needs.setup.outputs.package_version }}
      TAG_VERSION: ${{ needs.setup.outputs.tag_version }}
    steps:
      - name: Checkout repo
        uses: actions/checkout@5a4ac9002d0be2fb38bd78e4b4dbde5606d7042f # v2.3.4

      - name: Make target directory
        run: mkdir -p dist/mas-universal

      - name: Get Mac release asset
        uses: Xotl/cool-github-releases@16c58a5863d6ba9944f63ca8bb78bb3249ce1d81 # v1.1.6
        with:
          mode: download
          tag_name: ${{ env.TAG_VERSION }}
          assets: Bitwarden-${{ env.PKG_VERSION }}-universal.pkg|./dist/mas-universal/Bitwarden-${{ env.PKG_VERSION }}-universal.pkg
          github_token: ${{ secrets.GITHUB_TOKEN }}

      - name: Deploy to App Store
        run: npm run upload:mas
        env:
          APPLE_ID_USERNAME: ${{ secrets.APPLE_ID_USERNAME }}
          APPLE_ID_PASSWORD: ${{ secrets.APPLE_ID_PASSWORD }}

  publish:
    name: Publish Release
    runs-on: ubuntu-latest
    needs: 
      - setup
      - snap
      - choco
      - macos
    env:
      RELEASE_VERSION: ${{ needs.setup.outputs.release_version }}
      TAG_VERSION: ${{ needs.setup.outputs.tag_version }}
    steps:
      - name: Publish release
        run: |
          hub release edit \
            --draft=false \
            --message "" \
            $TAG_VERSION
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
