name: Generate and Publish Development Repositories
on:
  workflow_dispatch:
    inputs:
      prerelease:
        description: 'Is this a pre-release? [true|false]'
        required: false
        default: 'true'

  push:
    tags:
      - 'v*'
      - '*-dev'

jobs:
  repo-gen:
    if: github.repository == 'anxdpanic/plugin.video.youtube' || github.event_name == 'workflow_dispatch'
    name: Generate development repositories and upload them to mirrors
    runs-on: ubuntu-22.04
    permissions:
      contents: write

    strategy:
      fail-fast: false
      matrix:
        python-version: [ '3.x' ]

    steps:
      - name: Get and set release status
        # workflow_dispatch: use pre-release variable for release status
        # push-tag: check tag for alpha|beta|dev to determine release status
        id: release
        run: |
          version=${GITHUB_REF/refs\/tags\//}
          prerelease=${{ github.event.inputs.prerelease }}
          if [[ ! -z "${prerelease}" ]] ;
          then
            echo "pre-release=${prerelease}" >> $GITHUB_OUTPUT
          elif [[ $version == *[-+]@(alpha|beta|dev)*([.0-9a-z]) ]] ;
          then
            echo "pre-release=true" >> $GITHUB_OUTPUT
          else
            echo "pre-release=false" >> $GITHUB_OUTPUT
          fi

      - name: Set up Python ${{ matrix.python-version }}
        uses: actions/setup-python@v5
        with:
          python-version: ${{ matrix.python-version }}

      - name: Install dependencies
        # install lftp for mirroring repository
        # install lxml for repository generator script
        run: |
          sudo apt update
          sudo apt install lftp
          python -m pip install --upgrade pip
          pip install lxml

      - name: Checkout Official Branch (Unstable and Stable Releases)
        # Check out the master branch to use for official [unstable|stable] add-on zip source
        uses: actions/checkout@v4
        with:
          path: ./official_testing/${{ github.event.repository.name }}
          ref: "master"

      - name: Checkout Unofficial Branch (Unstable and Stable Releases)
        # Check out the nexus-unofficial branch to use for unofficial [unstable|stable] add-on zip source
        uses: actions/checkout@v4
        with:
          path: ./unofficial_testing/${{ github.event.repository.name }}
          ref: "nexus-unofficial"

      - name: Checkout Unofficial Branch (Stable Releases)
        # Check out the nexus-unofficial branch to use for unofficial [stable] add-on zip source
        if: steps.release.outputs.pre-release == 'false'
        uses: actions/checkout@v4
        with:
          path: ./unofficial/${{ github.event.repository.name }}
          ref: "nexus-unofficial"

      - name: Copy Repository Generator
        # Copy the repository generator script from master branch to cwd
        run: |
          cp  ./official_testing/${{ github.event.repository.name }}/.scripts/.prepare_repository.py .
          cp  ./official_testing/${{ github.event.repository.name }}/.scripts/.config.json .

      - name: Download Repository Add-on Files from FTP
        # Download [un]official testing repository add-ons source from mirrors for generating new repository add-on zips from source
        run: |
          lftp -c "\
          set ssl:verify-certificate false; \
          set sftp:auto-confirm yes; \
          open ${{ secrets.SFTP }}; \
          cd /root/anxdpanic/kodi/youtube/; \
          mirror --verbose --use-pget-n=8 -c --verbose repository.yt.testing_official ./official_testing/repository.yt.testing_official; \
          mirror --verbose --use-pget-n=8 -c --verbose repository.yt.testing_unofficial ./unofficial_testing/repository.yt.testing_unofficial; \
          bye \
          "

      - name: Download Unofficial Repository Add-on Files from FTP
        # Download unofficial repository add-on source from mirrors for generating new repository add-on zips from source
        if: steps.release.outputs.pre-release == 'false'
        run: |
          lftp -c "\
          set ssl:verify-certificate false; \
          set sftp:auto-confirm yes; \
          open ${{ secrets.SFTP }}; \
          cd /root/anxdpanic/kodi/youtube/; \
          mirror --verbose --use-pget-n=8 -c --verbose repository.yt.unofficial ./unofficial/repository.yt.unofficial; \
          bye \
          "

      - name: Generate Repositories
        # Run the repository generator script to generate zips, addons.xml, and addons.xml.gz
        run: |
          python .prepare_repository.py --prerelease=${{ steps.release.outputs.pre-release }}

      - name: Mirror Official Testing Repository to FTP (Unstable and Stable Releases)
        # Mirror the generated official testing repository to the mirrors
        # https://download.osmc.tv/dev/anxdpanic/kodi/youtube/official_testing/
        run: |
          lftp -c "\
          set ssl:verify-certificate false; \
          set sftp:auto-confirm yes; \
          open ${{ secrets.SFTP }}; \
          cd /root/anxdpanic/kodi/youtube/; \
          lcd repository/; \
          mirror --verbose --use-pget-n=8 -c --reverse --verbose official_testing official_testing; \
          bye \
          "

      - name: Mirror Unofficial Testing Repository to FTP (Unstable and Stable Releases)
        # Mirror the generated unofficial testing repository to the mirrors
        # https://download.osmc.tv/dev/anxdpanic/kodi/youtube/unofficial_testing/
        run: |
          lftp -c "\
          set ssl:verify-certificate false; \
          set sftp:auto-confirm yes; \
          open ${{ secrets.SFTP }}; \
          cd /root/anxdpanic/kodi/youtube/; \
          lcd repository/; \
          mirror --verbose --use-pget-n=8 -c --reverse --verbose unofficial_testing unofficial_testing; \
          bye \
          "

      - name: Mirror Unofficial Repository to FTP (Stable Releases)
        # Mirror the generated unofficial repository to the mirrors
        # https://download.osmc.tv/dev/anxdpanic/kodi/youtube/unofficial/
        if: steps.release.outputs.pre-release == 'false'
        run: |
          lftp -c "\
          set ssl:verify-certificate false; \
          set sftp:auto-confirm yes; \
          open ${{ secrets.SFTP }}; \
          cd /root/anxdpanic/kodi/youtube/; \
          lcd repository/; \
          mirror --verbose --use-pget-n=8 -c --reverse --verbose unofficial unofficial; \
          bye \
          "
