import { Writer } from 'clitastic'

import { config, VERBOSE } from './autorestic'
import { getEnvFromBackend } from './backend'
import { Locations, Location, ForgetPolicy, Flags } from './types'
import { exec, ConfigError } from './utils'



export const forgetSingle = (dryRun: boolean, name: string, from: string, to: string, policy: ForgetPolicy) => {
	if (!config) throw ConfigError
	const writer = new Writer(name + to.blue + ' : ' + 'Removing old spnapshots… ⏳')
	const backend = config.backends[to]
	const flags = [] as any[]
	for (const [name, value] of Object.entries(policy)) {
		flags.push(`--keep-${name}`)
		flags.push(value)
	}
	if (dryRun) {
		flags.push('--dry-run')
	}
	const env = getEnvFromBackend(backend)
	writer.replaceLn(name + to.blue + ' : ' + 'Forgeting old snapshots… ⏳')
	const cmd = exec('restic', ['forget', '--path', from, '--prune', ...flags], { env })

	if (VERBOSE) console.log(cmd.out, cmd.err)
	writer.done(name + to.blue + ' : ' + 'Done ✓'.green)
}

export const forgetLocation = (dryRun: boolean, name: string, backup: Location, policy?: ForgetPolicy) => {
	const display = name.yellow + ' ▶ '
	if (!policy) {
		console.log(display + 'skipping, no policy declared')
	} else {
		if (Array.isArray(backup.to)) {
			let first = true
			for (const t of backup.to) {
				const nameOrBlankSpaces: string = first
					? display
					: new Array(name.length + 3).fill(' ').join('')
				forgetSingle(dryRun, nameOrBlankSpaces, backup.from, t, policy)
				if (first) first = false
			}
		} else forgetSingle(dryRun, display, backup.from, backup.to, policy)
	}
}

export const forgetAll = (backups?: Locations, flags?: Flags) => {
	if (!config) throw ConfigError
	if (!backups) {
		backups = config.locations
	}

	console.log('\nRemoving old shapshots according to policy'.underline.grey)
	const dryRun = flags ? flags['dry-run'] : false
	if (dryRun) console.log('Running in dry-run mode, not touching data\n'.yellow)

	for (const [name, backup] of Object.entries(backups)) {
		const policy = config.locations[name].keep
		forgetLocation(dryRun, name, backup, policy)
	}
}
