import { expect } from 'vitest'

import { sandboxTest } from '../../setup.js'
import {
  cleanupBaseDir,
  createBaseDir,
  createRepoWithCommit,
} from './helpers.js'

sandboxTest('git restore --staged unstages changes', async ({ sandbox }) => {
  const baseDir = await createBaseDir(sandbox)

  try {
    const repoPath = await createRepoWithCommit(sandbox, baseDir)
    await sandbox.files.write(`${repoPath}/README.md`, 'changed\n')
    await sandbox.git.add(repoPath, { files: ['README.md'] })

    const status = await sandbox.git.status(repoPath)
    expect(status.hasStaged).toBe(true)

    await sandbox.git.restore(repoPath, {
      paths: ['README.md'],
      staged: true,
      worktree: false,
    })

    const statusAfter = await sandbox.git.status(repoPath)
    expect(statusAfter.hasStaged).toBe(false)
    expect(statusAfter.hasChanges).toBe(true)
  } finally {
    await cleanupBaseDir(sandbox, baseDir)
  }
})

sandboxTest(
  'git restore discards working tree changes',
  async ({ sandbox }) => {
    const baseDir = await createBaseDir(sandbox)

    try {
      const repoPath = await createRepoWithCommit(sandbox, baseDir)
      await sandbox.files.write(`${repoPath}/README.md`, 'changed\n')

      const status = await sandbox.git.status(repoPath)
      expect(status.isClean).toBe(false)

      await sandbox.git.restore(repoPath, { paths: ['README.md'] })

      const statusAfter = await sandbox.git.status(repoPath)
      expect(statusAfter.isClean).toBe(true)

      const contents = await sandbox.files.read(`${repoPath}/README.md`)
      expect(contents).toBe('hello\n')
    } finally {
      await cleanupBaseDir(sandbox, baseDir)
    }
  }
)
