name: MoviePilot Builder
on:
  workflow_dispatch:
  push:
    branches:
      - main
    paths:
      - version.py

jobs:
  Docker-build:
    runs-on: ubuntu-latest
    name: Build Docker Image
    steps:
      - name: Checkout
        uses: actions/checkout@v4

      - name: Release version
        id: release_version
        run: |
          app_version=$(cat version.py |sed -ne "s/APP_VERSION\s=\s'v\(.*\)'/\1/gp")
          echo "app_version=$app_version" >> $GITHUB_ENV

      - name: Docker Meta
        id: meta
        uses: docker/metadata-action@v5
        with:
          images: ${{ secrets.DOCKER_USERNAME }}/moviepilot
          tags: |
            type=raw,value=${{ env.app_version }}
            type=raw,value=latest

      - name: Set Up QEMU
        uses: docker/setup-qemu-action@v3

      - name: Set Up Buildx
        uses: docker/setup-buildx-action@v3

      - name: Login DockerHub
        uses: docker/login-action@v3
        with:
          username: ${{ secrets.DOCKER_USERNAME }}
          password: ${{ secrets.DOCKER_PASSWORD }}

      - name: Build Image
        uses: docker/build-push-action@v5
        with:
          context: .
          file: Dockerfile
          platforms: |
            linux/amd64
            linux/arm64/v8
          push: true
          build-args: |
            MOVIEPILOT_VERSION=${{ env.app_version }}
          tags: ${{ steps.meta.outputs.tags }}
          labels: ${{ steps.meta.outputs.labels }}
          cache-from: type=gha, scope=${{ github.workflow }}
          cache-to: type=gha, scope=${{ github.workflow }}

  Windows-build:
    runs-on: windows-latest
    name: Build Windows Binary
    steps:
      - name: Checkout
        uses: actions/checkout@v4

      - name: Init Python 3.11.4
        uses: actions/setup-python@v4
        with:
          python-version: '3.11.4'
          cache: 'pip'

      - name: Install Dependent Packages
        run: |
          python -m pip install --upgrade pip
          pip install wheel pyinstaller
          pip install -r requirements.txt
        shell: pwsh

      - name: Prepare Frontend
        run: |
          Invoke-WebRequest -Uri "http://nginx.org/download/nginx-1.25.2.zip" -OutFile "nginx.zip"
          Expand-Archive -Path "nginx.zip" -DestinationPath "nginx-1.25.2"
          Move-Item -Path "nginx-1.25.2/nginx-1.25.2" -Destination "nginx"
          Remove-Item -Path "nginx.zip"
          Remove-Item -Path "nginx-1.25.2" -Recurse -Force
          $FRONTEND_VERSION = (Invoke-WebRequest -Uri "https://api.github.com/repos/jxxghp/MoviePilot-Frontend/releases/latest" | ConvertFrom-Json).tag_name
          Invoke-WebRequest -Uri "https://github.com/jxxghp/MoviePilot-Frontend/releases/download/$FRONTEND_VERSION/dist.zip" -OutFile "dist.zip"
          Expand-Archive -Path "dist.zip" -DestinationPath "dist"
          Move-Item -Path "dist/dist/*" -Destination "nginx/html" -Force
          Remove-Item -Path "dist.zip"
          Remove-Item -Path "dist" -Recurse -Force
          Move-Item -Path "nginx/html/nginx.conf" -Destination "nginx/conf/nginx.conf" -Force
          New-Item -Path "nginx/temp" -ItemType Directory -Force          
          New-Item -Path "nginx/temp/__keep__.txt" -ItemType File -Force
          New-Item -Path "nginx/logs" -ItemType Directory -Force
          New-Item -Path "nginx/logs/__keep__.txt" -ItemType File -Force
        shell: pwsh

      - name: Pyinstaller
        run: |
          pyinstaller windows.spec
        shell: pwsh

      - name: Upload Windows File
        uses: actions/upload-artifact@v3
        with:
          name: windows
          path: dist/MoviePilot.exe

  Create-release:
    permissions: write-all
    runs-on: ubuntu-latest
    needs: [ Windows-build, Docker-build ]
    steps:
      - uses: actions/checkout@v2

      - name: Release Version
        id: release_version
        run: |
          app_version=$(cat version.py |sed -ne "s/APP_VERSION\s=\s'v\(.*\)'/\1/gp")
          echo "app_version=$app_version" >> $GITHUB_ENV

      - name: Download Artifact
        uses: actions/download-artifact@v3

      - name: get release_informations
        shell: bash
        run: |
          mkdir releases
          mv ./windows/MoviePilot.exe ./releases/MoviePilot_v${{ env.app_version }}.exe

      - name: Create Release
        id: create_release
        uses: actions/create-release@latest
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
        with:
          tag_name: v${{ env.app_version }}
          release_name: v${{ env.app_version }}
          body: ${{ github.event.commits[0].message }}
          draft: false
          prerelease: false

      - name: Upload Release Asset
        uses: dwenegar/upload-release-assets@v1
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
        with:
          release_id: ${{ steps.create_release.outputs.id }}
          assets_path: |
            ./releases/
