# Setup Branch Protection for main branch
# This script configures branch protection rules using GitHub CLI
# 
# Prerequisites:
# - GitHub CLI (gh) must be installed: https://cli.github.com/
# - You must be authenticated: gh auth login
# - You must have admin access to the repository

param(
    [string]$Repository = "dmytro-yemelianov/raps",
    [string]$Branch = "main"
)

Write-Host "Setting up branch protection for branch: $Branch" -ForegroundColor Cyan
Write-Host "Repository: $Repository" -ForegroundColor Cyan
Write-Host ""

# Check if gh CLI is installed
if (-not (Get-Command gh -ErrorAction SilentlyContinue)) {
    Write-Host "Error: GitHub CLI (gh) is not installed." -ForegroundColor Red
    Write-Host "Install it from: https://cli.github.com/" -ForegroundColor Yellow
    exit 1
}

# Check if authenticated - verify token works by making a simple API call
$authCheck = gh api user 2>&1
if ($LASTEXITCODE -ne 0) {
    Write-Host "Error: Not authenticated with GitHub CLI or token is invalid." -ForegroundColor Red
    Write-Host "Run: gh auth login" -ForegroundColor Yellow
    exit 1
}
Write-Host "Authenticated as: $((ConvertFrom-Json $authCheck).login)" -ForegroundColor Gray

Write-Host "Configuring branch protection rules..." -ForegroundColor Green

# Set branch protection rules
# This requires the following checks to pass:
# - check
# - test
# - fmt
# - clippy
# - docs
# - all-checks-pass

$requiredChecks = @(
    "check",
    "test",
    "fmt",
    "clippy",
    "docs",
    "all-checks-pass"
)

# Build the JSON payload for branch protection
$protectionPayload = @{
    required_status_checks = @{
        strict = $true
        contexts = $requiredChecks
    }
    enforce_admins = $true
    required_pull_request_reviews = @{
        required_approving_review_count = 1
        dismiss_stale_reviews = $true
        require_code_owner_reviews = $false
    }
    restrictions = $null
    required_linear_history = $false
    allow_force_pushes = $false
    allow_deletions = $false
}

$jsonPayload = $protectionPayload | ConvertTo-Json -Depth 10 -Compress

# Configure branch protection (pipe JSON to gh api)
$jsonPayload | gh api "repos/$Repository/branches/$Branch/protection" --method PUT --input -

if ($LASTEXITCODE -eq 0) {
    Write-Host ""
    Write-Host "✓ Branch protection configured successfully!" -ForegroundColor Green
    Write-Host ""
    Write-Host "Protection rules:" -ForegroundColor Cyan
    Write-Host "  - Require pull request reviews before merging" -ForegroundColor White
    Write-Host "  - Require status checks to pass before merging" -ForegroundColor White
    Write-Host "  - Require branches to be up to date before merging" -ForegroundColor White
    Write-Host "  - Include administrators" -ForegroundColor White
    Write-Host "  - Do not allow force pushes" -ForegroundColor White
    Write-Host "  - Do not allow branch deletion" -ForegroundColor White
    Write-Host ""
    Write-Host "Required status checks:" -ForegroundColor Cyan
    foreach ($check in $requiredChecks) {
        Write-Host "  - $check" -ForegroundColor White
    }
} else {
    Write-Host ""
    Write-Host "Error: Failed to configure branch protection." -ForegroundColor Red
    Write-Host "Make sure you have admin access to the repository." -ForegroundColor Yellow
    exit 1
}

