name: Deploy to Preview Server
on: 
  push:
    branches: [ preview ]
  workflow_dispatch:

permissions: write-all

jobs:
  secretscan:
    if: ${{ !github.event.act }} # skip during local actions testing
    name: Scan for Secrets
    runs-on: self-hosted
    steps:
    - name: Clone Repository
      uses: actions/checkout@v4
      with:
        ref: preview

    - name: Secret Scan
      uses: max/secret-scan@master
      with:
        exclude_path: 'SecretsIgnore.txt'

  spellcheck:
    if: ${{ !github.event.act }} # skip during local actions testing
    name: Spell Check with Typos
    runs-on: self-hosted
    steps:
    - name: Clone Repository
      uses: actions/checkout@v4
      with:
        ref: preview

    - name: Check spelling
      uses: crate-ci/typos@master

  preview_deploy:
    name: Build Project and Upload to Server
    runs-on: self-hosted
    steps:
      - name: Cleanup
        run: rm -rf ProjectMakotoPreview/

      - name: Install SSH Key
        if: ${{ !github.event.act }} # skip during local actions testing
        uses: shimataro/ssh-key-action@v2
        with:
          key: ${{ secrets.SSH_TOKEN }}
          known_hosts: ${{ secrets.SSH_KNOWN_HOST }}

      - name: Setup .NET Core SDK 8.x
        uses: actions/setup-dotnet@v5
        with:
          dotnet-version: | 
            9.x

      - name: "Clone Repository"
        uses: actions/checkout@v4
        with:
          ref: preview
          submodules: recursive
          path: ProjectMakotoPreview
          token: ${{ secrets.Access_token }}

      - name: Install Dependencies
        run: dotnet restore
        working-directory: ProjectMakotoPreview/ProjectMakoto/
        
      - name: Mark .sh files as executable
        run: find . -type f -name "*.sh" -exec chmod +x {} +
        working-directory: ProjectMakotoPreview/OfficialPlugins/
        
      - name: Prepare Makoto Plugin Build
        run: sh update_deps.sh
        working-directory: ProjectMakotoPreview/OfficialPlugins/
        
      - name: Build Makoto
        run: dotnet publish --configuration RELEASE --runtime linux-x64 --no-self-contained --output "build" --property:PublishDir="build" --framework net9.0
        working-directory: ProjectMakotoPreview/ProjectMakoto/
        timeout-minutes: 5

      - name: Create Version File
        run: git rev-parse --short HEAD > "ProjectMakoto/build/LatestGitPush.cfg" && git branch --show-current >> ProjectMakoto/build/LatestGitPush.cfg && echo $(date +%d.%m.%y) >> ProjectMakoto/build/LatestGitPush.cfg && echo $(date +%H:%M:%S,00) >> ProjectMakoto/build/LatestGitPush.cfg
        working-directory: ProjectMakotoPreview/

      - name: Build Makoto Plugins
        run: sh build_all.sh 1
        working-directory: ProjectMakotoPreview/OfficialPlugins/

      - name: Create plugins directory
        run: mkdir Plugins
        working-directory: ProjectMakotoPreview/ProjectMakoto/build

      - name: Move plugins into directory
        run: mv ../OfficialPlugins/*.pmpl build/Plugins/
        working-directory: ProjectMakotoPreview/ProjectMakoto/

      - name: Commit new trusted hashes
        working-directory: ProjectMakotoPreview/
        run: |
          git clone https://github.com/Fortunevale/ProjectMakoto.TrustedPlugins
          cd ProjectMakoto.TrustedPlugins
          mv ../OfficialPlugins/trusted_manifests/*.json hashes/
          git config --global user.name 'Project Makoto'
          git config --global user.email 'ichigo@aitsys.dev'
          git remote set-url origin https://x-access-token:${{ secrets.PROJECT_MAKOTO_ACCESS_TOKEN }}@github.com/Fortunevale/ProjectMakoto.TrustedPlugins
          git add -A
          git commit -am "Add new preview hashes"
          git push

      - name: Sleep for 10 seconds
        run: sleep 10
        shell: bash

      - name: Deploy to Preview Server
        if: ${{ !github.event.act }} # skip during local actions testing
        run: rsync -avz --delete --force -e "ssh -p ${{ secrets.SSH_PORT }}" . ${{ secrets.SSH_USERNAME }}@${{ secrets.SSH_SERVER }}:/home/${{ secrets.SSH_USERNAME }}/Bots/latestProjectIchigoPreview/
        working-directory: ProjectMakotoPreview/ProjectMakoto/build/

      - name: Send Update Signal to Preview Client
        if: ${{ !github.event.act }} # skip during local actions testing
        run: ssh ${{ secrets.SSH_USERNAME }}@${{ secrets.SSH_SERVER }} -p ${{ secrets.SSH_PORT }} touch /home/${{ secrets.SSH_USERNAME }}/Bots/ProjectIchigoPreview/updated

      - name: Create Zip File from Build
        run: zip -r Release.zip build
        working-directory: ProjectMakotoPreview/ProjectMakoto/

      - name: Truncate String
        uses: 2428392/gh-truncate-string-action@v1.3.0
        id: truncatedString
        with:
          stringToTruncate: ${{ github.sha }}
          maxLength: 10

      - name: Create Release
        if: ${{ !github.event.act }} # skip during local actions testing
        uses: ncipollo/release-action@v1.20.0
        with:
          artifacts: "ProjectMakotoPreview/ProjectMakoto/Release.zip"
          generateReleaseNotes: true
          prerelease: true
          tag: ${{ steps.truncatedString.outputs.string }}-pre
          commit: ${{ github.sha }}

      - name: Cleanup
        run: rm -rf ProjectMakotoPreview/
        if: always()