#!/usr/bin/env php
<?php

function extractBranchNamesFromInfo(string $branchInfo): array
{
    $branchNames = array_map(function (string $branchInfo): string {
        preg_match('/\s*((\w|-|\/)+)\s*/', $branchInfo, $matches);

        return $matches[1] ?? '';
    }, explode(PHP_EOL, $branchInfo));

    return array_filter($branchNames);
}

function filterIgnoredBranches(array $branchNames): array
{
    return array_filter($branchNames, function (string $branchName): bool {
        return !in_array($branchName, ['develop', 'master', 'staging', 'production']);
    });
}

$branchInfo = shell_exec('git branch -vv | grep ": gone]"');

# Return early if there are no branches to delete.
if ($branchInfo === NULL) {
  return;
}

$branchNames = extractBranchNamesFromInfo($branchInfo);
$filteredBranchNames = filterIgnoredBranches($branchNames);

$currentBranch = exec('git rev-parse --abbrev-ref HEAD');

foreach ($filteredBranchNames as $branchName) {
    if ($branchName == $currentBranch) {
        echo "Cannot delete {$branchName} as it is the current branch.";
        continue;
    }

    echo "Deleting {$branchName}...";
    exec("git branch -D ${branchName}");
}