/**
 * Branch Cleanup Command
 * Removes merged branches locally and remotely
 */

import { exec } from 'child_process'
import { promisify } from 'util'

const execAsync = promisify(exec)

export interface BranchCleanupOptions {
  local?: boolean
  remote?: boolean
  exclude?: string[]
  dryRun?: boolean
}

export async function handle(
  args: BranchCleanupOptions,
  context: any
): Promise<string> {
  const { local = true, remote = true, exclude = ['main', 'master', 'develop'], dryRun = false } = args

  const results: string[] = []

  try {
    // Get current branch
    const { stdout: currentBranch } = await execAsync('git rev-parse --abbrev-ref HEAD')

    if (local) {
      // Get merged local branches
      const { stdout: mergedBranches } = await execAsync('git branch --merged')

      const branchesToDelete = mergedBranches
        .split('\n')
        .map((b) => b.trim().replace('*', '').trim())
        .filter(
          (branch) =>
            branch &&
            branch !== currentBranch.trim() &&
            !exclude.includes(branch)
        )

      if (branchesToDelete.length > 0) {
        if (dryRun) {
          results.push(`Would delete local branches: ${branchesToDelete.join(', ')}`)
        } else {
          for (const branch of branchesToDelete) {
            await execAsync(`git branch -d ${branch}`)
            results.push(`✓ Deleted local branch: ${branch}`)
          }
        }
      } else {
        results.push('No local branches to clean up')
      }
    }

    if (remote) {
      // Get merged remote branches
      const { stdout: remoteBranches } = await execAsync('git branch -r --merged')

      const branchesToDelete = remoteBranches
        .split('\n')
        .map((b) => b.trim().replace('origin/', '').trim())
        .filter((branch) => branch && branch !== 'HEAD' && !exclude.includes(branch))

      if (branchesToDelete.length > 0) {
        if (dryRun) {
          results.push(`Would delete remote branches: ${branchesToDelete.join(', ')}`)
        } else {
          for (const branch of branchesToDelete) {
            await execAsync(`git push origin --delete ${branch}`)
            results.push(`✓ Deleted remote branch: ${branch}`)
          }
        }
      } else {
        results.push('No remote branches to clean up')
      }
    }

    return results.join('\n')
  } catch (error: any) {
    throw new Error(`Branch cleanup failed: ${error.message}`)
  }
}

export default { handle }
