# This script creates a basic Unity project structure in the current directory.
# To run the script, open a PowerShell terminal and execute the following command:
# .\CreateUnityProjectStructure.ps1

param(
    [string]$BaseDir = (Get-Location).Path
)

# Function to create a directory and handle errors
function Create-Dir {
    param([string]$Path)
    try {
        if (-not (Test-Path -Path $Path)) {
            New-Item -ItemType Directory -Force -Path $Path | Out-Null
            Write-Host "Created directory: $Path"
        } else {
            Write-Host "Directory already exists: $Path"
        }
    } catch {
        Write-Warning "Failed to create directory: $Path. Error: $($_.Exception.Message)"
    }
}

# Create the base project structure
Write-Host "Creating Unity project structure..."
Create-Dir "$BaseDir\Assets"
Create-Dir "$BaseDir\Packages"
Create-Dir "$BaseDir\ProjectSettings"
Create-Dir "$BaseDir\Logs"

# Create subdirectories under Assets
Write-Host "Creating subdirectories under Assets..."
Create-Dir "$BaseDir\Assets\Art"
Create-Dir "$BaseDir\Assets\Audio"
Create-Dir "$BaseDir\Assets\Prefabs"
Create-Dir "$BaseDir\Assets\Scenes"
Create-Dir "$BaseDir\Assets\Scripts"
Create-Dir "$BaseDir\Assets\UI"
Create-Dir "$BaseDir\Assets\Resources"
Create-Dir "$BaseDir\Assets\Settings"
Create-Dir "$BaseDir\Assets\ThirdParty"

# Inside Art
Create-Dir "$BaseDir\Assets\Art\Animations"
Create-Dir "$BaseDir\Assets\Art\Materials"
Create-Dir "$BaseDir\Assets\Art\Models"
Create-Dir "$BaseDir\Assets\Art\Textures"
Create-Dir "$BaseDir\Assets\Art\VFX"

# Inside Audio
Create-Dir "$BaseDir\Assets\Audio\Music"
Create-Dir "$BaseDir\Assets\Audio\SoundEffects"

# Inside Scenes
Create-Dir "$BaseDir\Assets\Scenes\MainMenu"
Create-Dir "$BaseDir\Assets\Scenes\Levels"
Create-Dir "$BaseDir\Assets\Scenes\Sandbox"

# Inside Scripts
Create-Dir "$BaseDir\Assets\Scripts\Managers"
Create-Dir "$BaseDir\Assets\Scripts\Gameplay"
Create-Dir "$BaseDir\Assets\Scripts\Utilities"
Create-Dir "$BaseDir\Assets\Scripts\Tests"

# Inside UI
Create-Dir "$BaseDir\Assets\UI\Fonts"
Create-Dir "$BaseDir\Assets\UI\Images"

# Inside Settings
Create-Dir "$BaseDir\Assets\Settings\Input"

# Create structure explanation file
$TreeStructure = "$BaseDir\structure.txt"
Write-Host "Writing structure explanation to $TreeStructure..."
@"
Unity Project Structure
========================

- Assets/               : Main folder for all game assets.
    - Art/                : Visual assets (animations, models, textures, etc.).
    - Audio/              : Sound assets (music and sound effects).
    - Prefabs/            : Reusable game objects (player, enemy, collectible items, etc.).
    - Scenes/             : Game scenes and levels.
    - Scripts/            : Code assets (C# scripts).
    - UI/                 : UI-related assets (fonts, sprites, etc.).
    - Resources/          : Dynamically loaded runtime assets.
    - Settings/           : Project settings (input, physics, rendering, etc.).
    - ThirdParty/         : Third-party assets and libraries (external packages and plugins).

- Packages/             : Unity Package Manager dependencies (managed by Unity).
- ProjectSettings/      : Project settings and configuration files (managed by Unity).
- Logs/                 : Log files (managed by Unity).
"@ | Set-Content -Path $TreeStructure -Encoding UTF8

# Create `.gitignore` file
$GitIgnoreFile = "$BaseDir\.gitignore"
Write-Host "Writing .gitignore file..."
@"
# Unity generated files
[Ll]ibrary/
[Tt]emp/
[Oo]bj/
[Bb]uild/
[Bb]uilds/
[Ll]ogs/
[Mm]emoryCaptures/
# Visual Studio
*.csproj
*.unityproj
*.sln
*.suo
*.tmp
*.user
*.userprefs
*.pidb
*.booproj
*.svd
# JetBrains Rider
.idea/
# OS generated files
.DS_Store
Thumbs.db
"@ | Set-Content -Path $GitIgnoreFile -Encoding UTF8

# Create `.gitattributes` file
$GitAttributesFile = "$BaseDir\.gitattributes"
Write-Host "Writing .gitattributes file..."
@"
# Set default behaviour to automatically merge binary files
* text=auto
# Unity YAML files
*.unity merge=unityyaml
*.asset merge=unityyaml
*.prefab merge=unityyaml
*.mat merge=unityyaml
*.anim merge=unityyaml
# Image files
*.png binary
*.jpg binary
*.jpeg binary
*.psd binary
# Audio files
*.mp3 binary
*.wav binary
"@ | Set-Content -Path $GitAttributesFile -Encoding UTF8

# Create `ignore.conf` file for Plastic SCM
$IgnoreConfFile = "$BaseDir\ignore.conf"
Write-Host "Writing ignore.conf file for Plastic SCM..."
@"
Library
library
Temp
temp
Obj
obj
Build
build
Builds
builds
UserSettings
usersettings
MemoryCaptures
memorycaptures
Logs
logs
.DS_Store*
Thumbs.db
Desktop.ini
*.apk
*.unitypackage
"@ | Set-Content -Path $IgnoreConfFile -Encoding UTF8

# Print completion message
Write-Host "Unity project structure created successfully in '$BaseDir'."
Write-Host "Refer to 'structure.txt' for directory explanations."
Write-Host ".gitignore, .gitattributes, and ignore.conf files created successfully!"
Write-Host "You can start building your Unity project now! 🚀 🎮 🎉"

# Note: Adjust execution policy if needed
# Set-ExecutionPolicy -Scope CurrentUser -ExecutionPolicy RemoteSigned