import { Command } from '@cliffy/command'
import { Contact } from '../src/contact.ts'
import { send } from '../src/send.ts'
import type { Mail } from '../types.ts'
import { templates, templateType } from './_templates_loader.ts'
import { promptProps } from './_prompt_template.ts'

//TODO completions for "--from"
//TODO require sudo for "--from !== !me"

export const cmd = new Command()
	.name('send')
	.description('Send a mail.')
	.type('template', templateType)
	.option(
		'-f, --from <account:string>',
		'From mail account or short name from config.',
		{ default: '!me' },
	)
	.option('-r, --recipient <recipient:string>', 'Recipient (to) of the mail.', {
		required: true,
		collect: true,
	})
	.option('--cc <recipient:string>', 'Copy carbon.', { collect: true })
	.option('--cci <recipient:string>', 'Copy carbon invisible.', {
		collect: true,
	})
	.option('-a, --attachments <file:file>', 'Attachments.', { collect: true })
	.option('-t, --template <name:template>', 'HTML template from config', {
		default: 'message',
	})
	.arguments('<subject:string>')
	.action(
		async ({ from, recipient, cc, cci, attachments, template }, subject) => {
			const fromContact: Contact = await (async () => {
				if (from === '!me') {
					const whoami = new Deno.Command('whoami', {
						stderr: 'inherit',
					})
					const { stdout } = await whoami.output()
					const rawName = new TextDecoder().decode(stdout).trim()
					const name = encodeURIComponent(rawName)

					return new Contact({
						name: `${name} de Cohabit`,
						address: `_${name}_@cohabit.fr`,
					})
				}
				if (from.startsWith('!')) {
					return Contact.expand(from.slice(1))
				}
				return Contact.fromString(from)
			})()

			const selectedTemplate = templates.get(template)!
			const props = await promptProps(selectedTemplate)

			const mail: Mail = {
				from: fromContact,
				to: recipient.map((to) => Contact.fromString(to)),
				subject,
				body: selectedTemplate.builder(props)!,
				options: {
					cc: cc?.map(Contact.fromString) ?? [],
					cci: cci?.map(Contact.fromString) ?? [],
					attachments: attachments ?? [],
				},
			}

			await send(mail)
		},
	)