---
name: Publish Release

# yamllint disable-line rule:truthy
on:
  workflow_dispatch:
  release:
    types: [published]
  schedule:
    - cron: "0 2 * * *"

permissions:
  contents: read

jobs:
  init:
    name: Initialize build
    runs-on: ubuntu-latest
    outputs:
      tag: ${{ steps.tag.outputs.tag }}
    steps:
      - uses: actions/checkout@v3
      - name: Get tag
        id: tag
        # yamllint disable rule:line-length
        run: |
          if [[ "$GITHUB_EVENT_NAME" = "release" ]]; then
            TAG="${GITHUB_REF#refs/tags/}"
          else
            TAG=$(cat esphome/const.py | sed -n -E "s/^__version__\s+=\s+\"(.+)\"$/\1/p")
            today="$(date --utc '+%Y%m%d')"
            TAG="${TAG}${today}"
            BRANCH=${GITHUB_REF#refs/heads/}
            if [[ "$BRANCH" != "dev" ]]; then
              TAG="${TAG}-${BRANCH}"
            fi
          fi
          echo "tag=${TAG}" >> $GITHUB_OUTPUT
        # yamllint enable rule:line-length

  deploy-pypi:
    name: Build and publish to PyPi
    if: github.repository == 'esphome/esphome' && github.event_name == 'release'
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v3
      - name: Set up Python
        uses: actions/setup-python@v4
        with:
          python-version: "3.x"
      - name: Set up python environment
        run: |
          script/setup
          pip install setuptools wheel twine
      - name: Build
        run: python setup.py sdist bdist_wheel
      - name: Upload
        env:
          TWINE_USERNAME: __token__
          TWINE_PASSWORD: ${{ secrets.PYPI_TOKEN }}
        run: twine upload dist/*

  deploy-docker:
    name: Build and publish ESPHome ${{ matrix.image.title}}
    if: github.repository == 'esphome/esphome'
    permissions:
      contents: read
      packages: write
    runs-on: ubuntu-latest
    continue-on-error: ${{ matrix.image.title == 'lint' }}
    needs: [init]
    strategy:
      fail-fast: false
      matrix:
        image:
          - title: "ha-addon"
            suffix: "hassio"
            target: "hassio"
            baseimg: "hassio"
          - title: "docker"
            suffix: ""
            target: "docker"
            baseimg: "docker"
          - title: "lint"
            suffix: "lint"
            target: "lint"
            baseimg: "docker"
    steps:
      - uses: actions/checkout@v3
      - name: Set up Python
        uses: actions/setup-python@v4
        with:
          python-version: "3.9"

      - name: Set up Docker Buildx
        uses: docker/setup-buildx-action@v2
      - name: Set up QEMU
        uses: docker/setup-qemu-action@v2

      - name: Log in to docker hub
        uses: docker/login-action@v2
        with:
          username: ${{ secrets.DOCKER_USER }}
          password: ${{ secrets.DOCKER_PASSWORD }}
      - name: Log in to the GitHub container registry
        uses: docker/login-action@v2
        with:
          registry: ghcr.io
          username: ${{ github.actor }}
          password: ${{ secrets.GITHUB_TOKEN }}

      - name: Generate short tags
        id: tags
        run: |
          docker/generate_tags.py \
            --tag "${{ needs.init.outputs.tag }}" \
            --suffix "${{ matrix.image.suffix }}"

      - name: Build and push
        uses: docker/build-push-action@v4
        with:
          context: .
          file: ./docker/Dockerfile
          platforms: linux/amd64,linux/arm/v7,linux/arm64
          target: ${{ matrix.image.target }}
          push: true
          # yamllint disable rule:line-length
          cache-from: type=registry,ref=ghcr.io/${{ steps.tags.outputs.image }}:cache-${{ steps.tags.outputs.channel }}
          cache-to: type=registry,ref=ghcr.io/${{ steps.tags.outputs.image }}:cache-${{ steps.tags.outputs.channel }},mode=max
          # yamllint enable rule:line-length
          tags: ${{ steps.tags.outputs.tags }}
          build-args: |
            BASEIMGTYPE=${{ matrix.image.baseimg }}
            BUILD_VERSION=${{ needs.init.outputs.tag }}

  deploy-ha-addon-repo:
    if: github.repository == 'esphome/esphome' && github.event_name == 'release'
    runs-on: ubuntu-latest
    needs: [deploy-docker]
    steps:
      - name: Trigger Workflow
        uses: actions/github-script@v6
        with:
          github-token: ${{ secrets.DEPLOY_HA_ADDON_REPO_TOKEN }}
          script: |
            github.rest.actions.createWorkflowDispatch({
              owner: "esphome",
              repo: "home-assistant-addon",
              workflow_id: "bump-version.yml",
              ref: "main",
              inputs: {
                version: "${{ github.event.release.tag_name }}",
                content: ${{ toJSON(github.event.release.body) }}
              }
            })
