name: Application build

on:
  push:
    branches: [ develop, release/pre, master ]
    paths:
      - Application/**
      - WebfrontCore/**
      - Data/**
      - SharedLibraryCore/**
      - Plugins/**
      - Integrations/**
      - .github/workflows/build_application.yml
  pull_request:
    branches: [ develop ]
    paths:
      - Application/**
      - WebfrontCore/**
      - Data/**
      - SharedLibraryCore/**
      - Plugins/**

env:
  releaseType: prerelease

jobs:
  update_revision_number:
    runs-on: ubuntu-latest
    
    outputs:
      revision_number: ${{ steps.revision.outputs.revision_number }}
    
    steps:
      - name: Checkout repository
        uses: actions/checkout@v4

      - name: Restore cache
        id: cache
        uses: actions/cache@v4
        with:
          path: cache_dir
          key: revision-number

      - name: Get current date
        id: date
        run: echo "current_date=$(date +'%Y-%m-%d')" >> $GITHUB_ENV

      - name: Check and update revision number
        id: revision
        run: |
          FILENAME=cache_dir/revision_number.txt
          DATEFILE=cache_dir/previous_date.txt

          mkdir -p cache_dir

          if [ -f "$DATEFILE" ]; then
            prev_date=$(cat "$DATEFILE")
            rev_number=$(cat "$FILENAME")
          else
            prev_date=""
            rev_number=0
          fi

          if [ "$current_date" = "$prev_date" ]; then
            rev_number=$((rev_number + 1))
          else
            rev_number=1
          fi

          echo "New revision number: $rev_number"
          echo $rev_number > "$FILENAME"
          echo $current_date > "$DATEFILE"
          echo "revision_number=$rev_number" >> $GITHUB_OUTPUT

      - name: Save cache
        uses: actions/cache@v4
        with:
          path: cache_dir
          key: revision-number

  make_version:
    runs-on: ubuntu-latest
    needs: [ update_revision_number ]
    
    outputs:
      build_num: ${{ steps.generate_build_number.outputs.build_num }}
    env:
      revisionNumber: ${{ needs.update_revision_number.outputs.revision_number }}
      
    steps:
      - name: Make build number
        id: generate_build_number
        run: |
          build_num=$(date +'%Y.%-m.%-d').${{ env.revisionNumber }}
          echo "build_num=$build_num" >> $GITHUB_OUTPUT
          echo "Build number is $build_num"
  
  build:
    runs-on: ubuntu-latest
    needs: [ make_version ]

    env:
      solution: IW4MAdmin.sln
      buildConfiguration: Prerelease
      isPreRelease: false

      buildPlatform: Any CPU
      outputFolder: ${{ github.workspace }}/Publish/Prerelease
      buildNumber: ${{ needs.make_version.outputs.build_num }}

    steps:
      - name: Checkout code
        uses: actions/checkout@v4

      - name: Setup .NET SDK
        uses: actions/setup-dotnet@v4
        with:
          dotnet-version: 8.0.x

      - name: Restore NuGet packages
        run: dotnet restore ${{ env.solution }}

      - name: Preload external resources
        run: |
          echo "Build Configuration is ${{ env.buildConfiguration }}, Release Type is ${{ env.releaseType }}"
          mkdir -p WebfrontCore/wwwroot/lib/open-iconic/font/css
          curl -o WebfrontCore/wwwroot/lib/open-iconic/font/css/open-iconic-bootstrap-override.scss https://raw.githubusercontent.com/iconic/open-iconic/master/font/css/open-iconic-bootstrap.scss
          sed -i 's#../fonts/#/font/#g' WebfrontCore/wwwroot/lib/open-iconic/font/css/open-iconic-bootstrap-override.scss

      - name: Build webfront
        run: dotnet build WebfrontCore/WebfrontCore.csproj -c ${{ env.buildConfiguration }} /p:Configuration=${{ env.buildConfiguration }} /p:Platform="x64"

      - name: Compile SCSS files
        run: |
          dotnet tool install Excubo.WebCompiler --global
          webcompiler -r WebfrontCore/wwwroot/css/src -o WebfrontCore/wwwroot/css/ -m disable -z disable
          webcompiler WebfrontCore/wwwroot/lib/open-iconic/font/css/open-iconic-bootstrap-override.scss -o WebfrontCore/wwwroot/css/ -m disable -z disable

      - name: Bundle JS files
        run: |
          echo 'Getting dotnet bundle'
          curl -o ${{ github.workspace }}/dotnet-bundle.zip https://raidmax.org/IW4MAdmin/res/dotnet-bundle.zip
          echo 'Unzipping download'
          unzip ${{ github.workspace }}/dotnet-bundle.zip -d ${{ github.workspace }}/bundle
          echo 'Executing dotnet-bundle'
          cd ${{ github.workspace }}/bundle
          dotnet dotnet-bundle.dll clean ${{ github.workspace }}/WebfrontCore/bundleconfig.json
          dotnet dotnet-bundle.dll ${{ github.workspace }}/WebfrontCore/bundleconfig.json

      - name: Build plugins
        run: |
          cd Plugins
          find . -name "*.csproj" -print0 | xargs -0 -I {} dotnet publish {} -c ${{ env.buildConfiguration }} -o ../BUILD/Plugins /p:Configuration=${{ env.buildConfiguration }} /p:Platform="x64" /p:DeployOnBuild=false /p:PackageAsSingleFile=false /p:SkipInvalidConfigurations=true /p:Version=${{ env.buildNumber }} --no-restore

      - name: Build application
        run: dotnet publish Application/Application.csproj -c ${{ env.buildConfiguration }} -o ${{ env.outputFolder }} /p:Version=${{ env.buildNumber }} /p:Configuration=${{ env.buildConfiguration }} /p:Platform="x64" --no-restore

      - name: Download translations
        run: |
          mkdir -p "${{ env.outputFolder }}/Localization"
          localizations=("en-US" "ru-RU" "es-EC" "pt-BR" "de-DE")
          for localization in "${localizations[@]}"
          do
            url="https://master.iw4.zip/localization/$localization"
            filePath="${{ env.outputFolder }}/Localization/IW4MAdmin.$localization.json"
            curl -s "$url" -o "$filePath"
          done

      - name: Download geolocation database
        run: |
          mkdir -p ${{ env.outputFolder }}/Resources
          wget -O ${{ env.outputFolder }}/Resources/GeoLite2-Country.mmdb https://github.com/P3TERX/GeoLite.mmdb/raw/download/GeoLite2-Country.mmdb
          
      - name: Clean up publish files
        run: |
          chmod +x ${{ github.workspace }}/Application/BuildScripts/PostBuild.sh
          bash ${{ github.workspace }}/Application/BuildScripts/PostBuild.sh ${{ env.outputFolder }} ${{ github.workspace }}

      - name: Generate start scripts
        run: |
          cat << EOF > "${{ env.outputFolder }}/StartIW4MAdmin.cmd"
          @echo off
          @title IW4MAdmin
          set DOTNET_CLI_TELEMETRY_OPTOUT=1
          dotnet Lib\IW4MAdmin.dll
          pause
          EOF
          
          cat << EOF > "${{ env.outputFolder }}/StartIW4MAdmin.sh"
          #!/bin/bash
          export DOTNET_CLI_TELEMETRY_OPTOUT=1
          dotnet Lib/IW4MAdmin.dll
          EOF

      - name: Move extra content into publish directory
        run: |
          cp ${{ github.workspace }}/Plugins/ScriptPlugins/*.js ${{ env.outputFolder }}/Plugins/
          cp ${{ github.workspace }}/BUILD/Plugins/*.dll ${{ env.outputFolder }}/Plugins/
          mkdir -p ${{ env.outputFolder }}/wwwroot/css
          cp ${{ github.workspace }}/WebfrontCore/wwwroot/css/global.min.css ${{ env.outputFolder }}/wwwroot/css/global.min.css
          mkdir -p ${{ env.outputFolder }}/wwwroot/js
          cp ${{ github.workspace }}/WebfrontCore/wwwroot/js/global.min.js ${{ env.outputFolder }}/wwwroot/js/global.min.js
          mkdir -p ${{ env.outputFolder }}/wwwroot/font
          rsync -ar ${{ github.workspace }}/WebfrontCore/wwwroot/lib/open-iconic/font/fonts/ ${{ env.outputFolder }}/wwwroot/font
          mkdir -p ${{ env.outputFolder }}/GameFiles
          rsync -ar ${{ github.workspace }}/GameFiles/ ${{ env.outputFolder }}/GameFiles
          mkdir -p ${{ env.outputFolder }}/wwwroot/images/
          rsync -ar ${{ github.workspace }}/WebfrontCore/wwwroot/images/ ${{ env.outputFolder }}/wwwroot/images/
          rsync -ar ${{ github.workspace }}/BUILD/Plugins/wwwroot/ ${{ env.outputFolder }}/wwwroot/
          cp ${{ github.workspace }}/DeploymentFiles/UpdateIW4MAdmin.ps1 ${{ env.outputFolder }}/UpdateIW4MAdmin.ps1
          cp ${{ github.workspace }}/DeploymentFiles/UpdateIW4MAdmin.sh ${{ env.outputFolder }}/UpdateIW4MAdmin.sh

      - name: Upload artifact for analysis
        uses: actions/upload-artifact@v4
        with:
          name: IW4MAdmin-${{ env.buildNumber }}-${{ env.releaseType }}
          path: ${{ env.outputFolder }}
  
  release_github:
    runs-on: ubuntu-latest
    needs: [ make_version, build ]
    permissions:
      contents: write
    environment: prerelease
    if: ${{ github.ref == 'refs/heads/master' || github.ref == 'refs/heads/release/pre' }}
    
    env:
      buildNumber: ${{ needs.make_version.outputs.build_num }}
    
    steps:
      - name: Download build
        uses: actions/download-artifact@v4
        with:
          name: IW4MAdmin-${{ env.buildNumber }}-${{ env.releaseType }}
          path: ${{ github.workspace }}/artifact

      - name: Zip build
        run: |
          cd ${{ github.workspace }}/artifact
          zip -r IW4MAdmin-${{ env.buildNumber }}.zip .

      - name: Make release
        uses: ncipollo/release-action@v1
        with:
          tag: ${{ env.buildNumber }}-${{ env.releaseType }}
          name: IW4MAdmin ${{ env.buildNumber }}
          draft: false
          prerelease: true
          body: Automated rolling release - changelog below. [Updating Instructions](https://github.com/RaidMax/IW4M-Admin/wiki/Getting-Started#updating)
          generateReleaseNotes: true
          artifacts: ${{ github.workspace }}/artifact/*.zip
          artifactErrorsFailBuild: true

  update_master_version:
    runs-on: ubuntu-latest
    needs: [ make_version, build, release_github ]
    if: ${{ github.ref == 'refs/heads/master' || github.ref == 'refs/heads/release/pre' }}

    env:
      buildNumber: ${{ needs.make_version.outputs.build_num }}
    
    steps:
      - name: Update master version
        run: |
          curl --header "Content-Type: application/json" \
          --request POST \
          --data '{"current-version-${{ env.releaseType }}":"${{ env.buildNumber }}","jwt-secret": "${{ secrets.JWTSecret }}"}' \
          http://api.raidmax.org:5000/version
