import process from 'node:process'
import { Command } from 'commander'
import { logger } from '../../core/logger.ts'
import { patchProgress, readProgress } from '../../daemon/update/progress.ts'
import { rollback } from '../../daemon/update/rollback.ts'
import { restartService } from '../service/index.ts'
import { confirmYesNo } from '../util/prompt.ts'

export const rollbackCommand = new Command('rollback')
  .description('Roll back to the version before the last update (restores the pre-update database).')
  .action(async () => {
    const p = await readProgress()
    if (!p || !p.fromVersion) {
      logger.print('No previous update on record — nothing to roll back to.')
      process.exitCode = 1
      return
    }

    logger.print(`Last update: v${p.fromVersion} → v${p.toVersion}  (${p.stage})`)
    logger.print('')
    logger.print(`Rolling back reinstalls v${p.fromVersion} and restores the database`)
    logger.print('snapshot taken before that update. Anything captured since is lost.')
    logger.print('')
    const yes = await confirmYesNo(`Roll back to v${p.fromVersion}?`, false)
    if (!yes) {
      logger.print('Cancelled.')
      return
    }

    logger.print(`Rolling back to v${p.fromVersion} …`)
    try {
      await rollback(p.fromVersion, p.dbBackupPath)
    } catch (e) {
      const msg = e instanceof Error ? e.message : String(e)
      logger.print(`Rollback failed: ${msg}`)
      logger.print('Restore manually from ~/.openthomas/backups if needed.')
      process.exitCode = 1
      return
    }
    await patchProgress({
      stage: 'rolled-back',
      message: `manually rolled back to ${p.fromVersion}`,
    })
    await restartService()
    logger.print(`✓ Rolled back to v${p.fromVersion}. The daemon is restarting.`)
  })
