name: Unreal Engine Build

on:
  push:
    branches: [ main, develop ]

jobs:
  # windows-build:
  #   runs-on: windows
  #   steps:
  #     - name: Checkout repository
  #       uses: actions/checkout@v3
  #       with:
  #         lfs: true
  #         fetch-depth: 0
      
  #     - name: Set Unreal Engine Path
  #       run: |
  #         echo "UE_ROOT=F:\LuckyRobots\LuckyRobots\Engine" >> $Env:GITHUB_ENV
  #         echo "DOTNET_CLI_HOME=$env:TEMP" >> $Env:GITHUB_ENV
  #         echo "MSBUILDDISABLENODEREUSE=1" >> $Env:GITHUB_ENV
  #         echo "DOTNET_SKIP_FIRST_TIME_EXPERIENCE=1" >> $Env:GITHUB_ENV
  #         echo "DOTNET_CLI_TELEMETRY_OPTOUT=1" >> $Env:GITHUB_ENV
  #         echo "DOTNET_BUILD_OUTPUT_DIR=$env:TEMP\dotnet-build" >> $Env:GITHUB_ENV
        
  #     - name: Set up build environment
  #       run: |
  #         # Create a custom build output directory in temp
  #         $buildRoot = Join-Path $env:TEMP "unreal-build"
  #         $dotnetBuildDir = Join-Path $buildRoot "dotnet-build"
  #         $buildOutputDir = Join-Path $buildRoot "output"
          
  #         # Create directories with full permissions
  #         foreach ($dir in @($buildRoot, $dotnetBuildDir, $buildOutputDir)) {
  #           New-Item -ItemType Directory -Force -Path $dir
  #           icacls $dir /grant Everyone:F /T
  #         }
          
  #         # Set environment variables for build paths
  #         echo "DOTNET_BUILD_OUTPUT_DIR=$dotnetBuildDir" >> $Env:GITHUB_ENV
  #         echo "DOTNET_CLI_HOME=$dotnetBuildDir" >> $Env:GITHUB_ENV
  #         echo "DOTNET_SKIP_FIRST_TIME_EXPERIENCE=1" >> $Env:GITHUB_ENV
  #         echo "DOTNET_CLI_TELEMETRY_OPTOUT=1" >> $Env:GITHUB_ENV
  #         echo "DOTNET_USE_POLLING_FILE_WATCHER=true" >> $Env:GITHUB_ENV
  #         echo "MSBUILDDISABLENODEREUSE=1" >> $Env:GITHUB_ENV
  #         echo "MSBuildSDKsPath=$env:UE_ROOT\Binaries\ThirdParty\DotNet\8.0.300\win-x64\sdk\8.0.300\Sdks" >> $Env:GITHUB_ENV
          
  #         # Clean any existing build artifacts
  #         Remove-Item -Path "$dotnetBuildDir\*" -Recurse -Force -ErrorAction SilentlyContinue
  #         Remove-Item -Path "$buildOutputDir\*" -Recurse -Force -ErrorAction SilentlyContinue
          
  #         # Set up global.json to use the correct SDK version
  #         $globalJson = @'
  #         {
  #           "sdk": {
  #             "version": "8.0.300",
  #             "rollForward": "latestFeature"
  #           }
  #         }
  #         '@
  #         Set-Content -Path "global.json" -Value $globalJson
          
  #         # Create Directory.Build.props to redirect all outputs
  #         $buildPropsContent = @'
  #         <?xml version="1.0" encoding="utf-8"?>
  #         <Project>
  #           <PropertyGroup>
  #             <BaseIntermediateOutputPath>$(DOTNET_BUILD_OUTPUT_DIR)\obj\$(MSBuildProjectName)\</BaseIntermediateOutputPath>
  #             <BaseOutputPath>$(DOTNET_BUILD_OUTPUT_DIR)\bin\$(MSBuildProjectName)\</BaseOutputPath>
  #             <IntermediateOutputPath>$(BaseIntermediateOutputPath)</IntermediateOutputPath>
  #             <OutputPath>$(BaseOutputPath)</OutputPath>
  #             <AppendTargetFrameworkToOutputPath>false</AppendTargetFrameworkToOutputPath>
  #             <AppendRuntimeIdentifierToOutputPath>false</AppendRuntimeIdentifierToOutputPath>
  #             <GenerateRuntimeConfigurationFiles>true</GenerateRuntimeConfigurationFiles>
  #             <CopyLocalLockFileAssemblies>true</CopyLocalLockFileAssemblies>
  #             <RestoreNoCache>true</RestoreNoCache>
  #             <EnforceWritePermissions>false</EnforceWritePermissions>
  #           </PropertyGroup>
  #         </Project>
  #         '@
  #         Set-Content -Path "Directory.Build.props" -Value $buildPropsContent -Encoding UTF8

  #         # Create a temporary nuget.config file to use a local package cache
  #         $nugetConfig = @'
  #         <?xml version="1.0" encoding="utf-8"?>
  #         <configuration>
  #           <config>
  #             <add key="globalPackagesFolder" value="$(DOTNET_BUILD_OUTPUT_DIR)\packages" />
  #           </config>
  #         </configuration>
  #         '@
  #         Set-Content -Path "nuget.config" -Value $nugetConfig -Encoding UTF8
          
  #         # Set MSBuild configuration to use the temp directory
  #         $MSBuildPath = Join-Path $env:UE_ROOT "Binaries\ThirdParty\DotNet\8.0.300\win-x64\sdk\8.0.300"
  #         $env:MSBuildExtensionsPath = $MSBuildPath
  #         $env:MSBuildSDKsPath = Join-Path $MSBuildPath "Sdks"
  #         echo "MSBuildExtensionsPath=$env:MSBuildExtensionsPath" >> $Env:GITHUB_ENV
  #         echo "MSBuildSDKsPath=$env:MSBuildSDKsPath" >> $Env:GITHUB_ENV
  #         echo "MSBUILD_EXE_PATH=$MSBuildPath\MSBuild.dll" >> $Env:GITHUB_ENV
        
  #     - name: Locate .uproject file
  #       run: |
  #         $projectPath = Get-ChildItem -Path ".\" -Filter "*.uproject" -Recurse | Select-Object -First 1 -ExpandProperty FullName
  #         if (-not $projectPath) {
  #           Write-Error "No .uproject file found in repository"
  #           exit 1
  #         }
  #         echo "UPROJECT_PATH=$projectPath" >> $Env:GITHUB_ENV
  #         Write-Host "Found project file: $projectPath"

  #     - name: Build Unreal Project
  #       run: |
  #         # Create and set permissions for build output directory
  #         $buildOutputDir = Join-Path $env:TEMP "unreal-build\output"
  #         New-Item -ItemType Directory -Force -Path $buildOutputDir
  #         icacls $buildOutputDir /grant Everyone:F
          
  #         # Register dotnet locally
  #         $dotnetPath = Join-Path $env:UE_ROOT "Binaries\ThirdParty\DotNet\8.0.300\win-x64\dotnet.exe"
  #         $env:PATH = "$env:UE_ROOT\Binaries\ThirdParty\DotNet\8.0.300\win-x64;$env:PATH"
          
  #         # Make a local copy of the MSBuild directory with write permissions
  #         $customMSBuildDir = Join-Path $env:TEMP "msbuild-custom"
  #         New-Item -ItemType Directory -Force -Path $customMSBuildDir
  #         Copy-Item -Path "$env:UE_ROOT\Binaries\ThirdParty\DotNet\8.0.300\win-x64\sdk\8.0.300\*" -Destination $customMSBuildDir -Recurse -Force
  #         icacls $customMSBuildDir /grant Everyone:F /T
          
  #         # Set environment variables for the custom MSBuild
  #         $env:MSBuildExtensionsPath = $customMSBuildDir
  #         $env:MSBuildSDKsPath = Join-Path $customMSBuildDir "Sdks"
          
  #         # Run the build with environment variables 
  #         $uatPath = Join-Path $env:UE_ROOT "Build\BatchFiles\RunUAT.bat"
  #         $envVars = "set DOTNET_CLI_HOME=$env:DOTNET_CLI_HOME && " +
  #                    "set DOTNET_BUILD_OUTPUT_DIR=$env:DOTNET_BUILD_OUTPUT_DIR && " +
  #                    "set DOTNET_SKIP_FIRST_TIME_EXPERIENCE=1 && " +
  #                    "set DOTNET_CLI_TELEMETRY_OPTOUT=1 && " +
  #                    "set DOTNET_USE_POLLING_FILE_WATCHER=true && " +
  #                    "set MSBuildExtensionsPath=$env:MSBuildExtensionsPath && " +
  #                    "set MSBuildSDKsPath=$env:MSBuildSDKsPath && " +
  #                    "set MSBUILD_EXE_PATH=$env:MSBUILD_EXE_PATH && "
                     
  #         # Find project file
  #         $projectPath = Get-ChildItem -Path ".\" -Filter "*.uproject" -Recurse | Select-Object -First 1 -ExpandProperty FullName
  #         if (-not $projectPath) {
  #           Write-Error "No .uproject file found in repository"
  #           exit 1
  #         }
  #         Write-Host "Using project file: $projectPath"
          
  #         # Run UAT with full command
  #         $cmdLine = "$envVars cmd.exe /c `"$uatPath`" BuildCookRun -project=`"$projectPath`" -noP4 -platform=Win64 -clientconfig=Development -cook -build -stage -pak -archive -archivedirectory=`"$buildOutputDir`""
  #         Write-Host "Running command: $cmdLine"
  #         Invoke-Expression $cmdLine

  #     - name: Upload build artifacts
  #       uses: actions/upload-artifact@v3
  #       with:
  #         name: windows-build
  #         path: BuildOutput/
  #         retention-days: 7

  macos-build:
    runs-on: macos
    steps:
      - name: Checkout repository
        uses: actions/checkout@v3
        with:
          lfs: true
          fetch-depth: 0
      
      - name: Setup Unreal Engine
        run: |
          # Use the correct path where Unreal Engine is installed
          UE_PATH="/Users/Shared/Epic Games/UE_5.5"
          
          if [ ! -d "$UE_PATH" ]; then
            echo "Error: Unreal Engine is not installed in the expected location"
            echo "Please ensure Unreal Engine is installed at $UE_PATH"
            exit 1
          fi
          
          # Set environment variable with the correct Engine path
          echo "UE_ROOT=$UE_PATH/Engine" >> $GITHUB_ENV
          echo "Using Unreal Engine 5.5"
      
      - name: Build Unreal Project
        run: |
          # Debug information
          echo "=== Environment Information ==="
          echo "macOS Version:"
          sw_vers
          echo "Current working directory: $(pwd)"
          ls -la  # List all files in current directory
          
          echo "=== Unreal Engine Information ==="
          ls -la "$UE_ROOT/Build/BatchFiles"
          
          echo "=== Project Information ==="
          # Detailed search for the project file
          echo "Searching for .uproject files:"
          find . -name "*.uproject" -type f
          
          # Get the absolute path of the project file
          UPROJECT_PATH=$(find . -name "*.uproject" -type f | head -1)
          if [ -z "$UPROJECT_PATH" ]; then
            echo "Error: Could not find .uproject file"
            exit 1
          fi
          
          # Convert to absolute path and verify file exists
          UPROJECT_ABSOLUTE_PATH=$(realpath "$UPROJECT_PATH")
          echo "Project absolute path: $UPROJECT_ABSOLUTE_PATH"
          
          if [ ! -f "$UPROJECT_ABSOLUTE_PATH" ]; then
            echo "Error: Project file does not exist at: $UPROJECT_ABSOLUTE_PATH"
            exit 1
          fi
          
          echo "Using Unreal Engine at: $UE_ROOT"
          
          # Make the project file readable and executable
          chmod 755 "$UPROJECT_ABSOLUTE_PATH"
          
          # Run the build using absolute paths
          chmod +x "$UE_ROOT/Build/BatchFiles/RunUAT.sh"
          "$UE_ROOT/Build/BatchFiles/RunUAT.sh" BuildCookRun \
            -project="$UPROJECT_ABSOLUTE_PATH" \
            -noP4 \
            -platform=Mac \
            -clientconfig=Development \
            -cook -build -stage -pak -archive \
            -archivedirectory="$(pwd)/Builds"
            
          # Debug: Show exactly what was built
          echo "=== Build Output Structure ==="
          echo "Listing Builds directory contents:"
          ls -la Builds/
          echo "Showing detailed directory structure:"
          find Builds -type d | sort
          echo "Searching for app bundles:"
          find Builds -name "*.app" -type d || echo "No .app bundles found"
          echo "Searching for executable files:"
          find Builds -type f -perm +111 || echo "No executable files found"
          echo "Listing top-level files by type:"
          find Builds -type f -not -path "*/\.*" | grep -v "DS_Store" | sort | xargs file || echo "No files to list"
      
      - name: Upload build artifacts
        uses: actions/upload-artifact@v3
        with:
          name: macos-build
          path: Builds/
          retention-days: 7
          
      - name: Prepare release files
        run: |
          echo "Preparing packaged files for release..."
          
          # Create a directory for release files
          mkdir -p PackagedReleases
          
          # Debug: Show what we're packaging
          echo "=== Packaging for Release ==="
          echo "Build directory contents:"
          ls -la Builds/
          
          # Find the app bundle in the Builds directory
          APP_PATH=$(find Builds -type d -name "*.app" | head -1)
          
          if [ -n "$APP_PATH" ]; then
            echo "Found app bundle: $APP_PATH"
            
            # Fix permissions for all executable files in the app bundle
            find "$APP_PATH" -type f -perm +111 -exec chmod 755 {} \;
            
            # Ensure the main executable has proper permissions
            if [ -d "$APP_PATH/Contents/MacOS" ]; then
              chmod 755 "$APP_PATH/Contents/MacOS"/*
              echo "Set executable permissions on main executables"
            fi
            
            # Create Info.plist if it doesn't exist or is incomplete
            if [ ! -f "$APP_PATH/Contents/Info.plist" ] || ! grep -q CFBundleExecutable "$APP_PATH/Contents/Info.plist"; then
              echo "Fixing or creating Info.plist"
              APP_NAME=$(basename "$APP_PATH" .app)
              EXEC_NAME=$(find "$APP_PATH" -type f -perm +111 -name "$APP_NAME" -o -name "UnrealGame" -o -name "*Game" | head -1 | xargs basename 2>/dev/null || echo "$APP_NAME")
              
              # Create a basic Info.plist if needed
              if [ ! -f "$APP_PATH/Contents/Info.plist" ]; then
                mkdir -p "$APP_PATH/Contents"
                cat > "$APP_PATH/Contents/Info.plist" << EOF
                <?xml version="1.0" encoding="UTF-8"?>
                <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
                <plist version="1.0">
                <dict>
                    <key>CFBundleExecutable</key>
                    <string>$EXEC_NAME</string>
                    <key>CFBundleIconFile</key>
                    <string>AppIcon</string>
                    <key>CFBundleIdentifier</key>
                    <string>com.epicgames.$APP_NAME</string>
                    <key>CFBundleInfoDictionaryVersion</key>
                    <string>6.0</string>
                    <key>CFBundleName</key>
                    <string>$APP_NAME</string>
                    <key>CFBundlePackageType</key>
                    <string>APPL</string>
                    <key>CFBundleShortVersionString</key>
                    <string>1.0</string>
                    <key>LSMinimumSystemVersion</key>
                    <string>10.14.0</string>
                    <key>NSHighResolutionCapable</key>
                    <true/>
                </dict>
                </plist>
                EOF
                echo "Created new Info.plist file"
              fi
            fi
            
            # Get the app name
            APP_NAME=$(basename "$APP_PATH")
            
            # Make a special README with instructions
            cat > "PackagedReleases/README-MacOS-Instructions.txt" << EOF
            IMPORTANT INSTRUCTIONS FOR MACOS USERS
            --------------------------------------

            After downloading and extracting the zip file:

            1. Right-click on the $APP_NAME and select "Open" (simply double-clicking may not work the first time)
            2. When prompted with a security warning, click "Open" again
            3. If you still get security warnings, go to System Preferences > Security & Privacy 
              and click "Open Anyway" for the application

            Alternatively, you can run this command in Terminal:
            xattr -cr /path/to/$APP_NAME

            This removes the quarantine attribute that may prevent the app from running.

            EOF
            
            # Create zip file of the app bundle with recursive permissions preserved
            (cd $(dirname "$APP_PATH") && zip -ry "../../PackagedReleases/${APP_NAME%.app}-macOS.zip" "$APP_NAME" "README-MacOS-Instructions.txt")
            echo "Created packaged release: PackagedReleases/${APP_NAME%.app}-macOS.zip"
          else
            echo "No .app bundle found in Builds directory"
            
            # Look for a directory that might be a bundle but not named .app
            MAIN_BUILD_DIR=$(find Builds -mindepth 1 -maxdepth 1 -type d | head -1)
            if [ -n "$MAIN_BUILD_DIR" ]; then
              echo "Found main build directory: $MAIN_BUILD_DIR"
              DIR_NAME=$(basename "$MAIN_BUILD_DIR")
              
              # Fix permissions for all executable files
              find "$MAIN_BUILD_DIR" -type f -perm +111 -exec chmod 755 {} \;
              echo "Fixed executable permissions"
              
              # Create a basic README with instructions
              cat > "PackagedReleases/README-MacOS-Instructions.txt" << EOF
              IMPORTANT INSTRUCTIONS FOR MACOS USERS
              --------------------------------------

              After downloading and extracting the zip file:

              1. You may need to make the game executable with this Terminal command:
                chmod +x /path/to/game/executable
                
              2. If macOS still prevents the app from running, try:
                xattr -cr /path/to/extracted/folder

              This removes the quarantine attribute that may prevent the app from running.

              EOF
              
              # Package this directory as if it were the app
              (cd $(dirname "$MAIN_BUILD_DIR") && zip -ry "../../PackagedReleases/${DIR_NAME}-macOS.zip" "$DIR_NAME" "README-MacOS-Instructions.txt")
              echo "Created packaged release from main directory: PackagedReleases/${DIR_NAME}-macOS.zip"
            else
              # Package the entire Builds directory as a fallback
              echo "No main directory found, packaging everything"
              
              # Create a basic README with instructions
              cat > "PackagedReleases/README-MacOS-Instructions.txt" << EOF
              IMPORTANT INSTRUCTIONS FOR MACOS USERS
              --------------------------------------

              After downloading and extracting the zip file, you may need these steps:

              1. Navigate to the extracted folder in Terminal
              2. Find the main executable (it may be hidden in sub-folders)
              3. Make it executable with: chmod +x /path/to/executable
              4. Run it with: ./executable_name

              If macOS security prevents execution, try:
              xattr -cr /path/to/extracted/folder

              EOF
              
              zip -ry "PackagedReleases/game-macOS.zip" Builds "PackagedReleases/README-MacOS-Instructions.txt"
              echo "Created fallback package: PackagedReleases/game-macOS.zip"
            fi
          fi
          
          # List created packages
          echo "Packaged releases:"
          ls -la PackagedReleases/

      - name: Create Tag
        if: github.ref == 'refs/heads/main' || github.ref == 'refs/heads/develop'
        run: |
          TAG="v${{ github.run_number }}"
          echo "Creating git tag: $TAG"
          
          # Configure git with token authentication
          git config --global user.email "actions@gitea.com"
          git config --global user.name "Gitea Actions"
          
          # Direct token approach - simplest method
          git remote set-url origin "https://goran:${{ secrets.GITEATOKEN }}@luckyrobots.com/goran/lyra_game_ue.git"
          
          # Set git to not prompt for input
          export GIT_TERMINAL_PROMPT=0
          
          # Check if tag exists
          if ! git rev-parse "$TAG" >/dev/null 2>&1; then
            # Create tag without opening editor (-m flag)
            git tag -a "$TAG" -m "Release $TAG"
            
            # Push with timeout and debug
            echo "Pushing tag $TAG to origin..."
            git push --verbose origin "$TAG" || {
              echo "Error: Failed to push tag. Check your token permissions."
              exit 1
            }
            echo "Successfully created and pushed tag: $TAG"
          else
            echo "Tag $TAG already exists, skipping tag creation"
          fi
          echo "RELEASE_TAG=$TAG" >> $GITHUB_ENV

      - name: Create Gitea Release
        if: github.ref == 'refs/heads/main' || github.ref == 'refs/heads/develop'
        uses: https://gitea.com/actions/gitea-release-action@main
        with:
          token: ${{ secrets.GITEATOKEN }}
          tag_name: ${{ env.RELEASE_TAG }}
          title: "Release ${{ env.RELEASE_TAG }}"
          files: PackagedReleases/*.zip