import { Request, Response } from 'express'
import { Misc } from '../models'
import helpers from '../../../utils/helpers'

const MISC_ID = 'common'

async function getWhitelistEmails(req: Request, res: Response) {
	await helpers.runApi(res, async () => {
		const misc = await Misc.findById(MISC_ID)
		if (!misc) {
			return res.status(404).json({ message: 'data not found' })
		}
		const whitelistEmails = misc.whitelistEmails ?? []
		return res.json({ whitelistEmails })
	})
}

async function postWhitelistEmail(req: Request, res: Response) {
	await helpers.runApi(res, async () => {
		const { email } = req.body
		const misc = await Misc.findById(MISC_ID)
		if (!misc) {
			return res.status(404).json({ message: 'data not found' })
		}
		if (misc.whitelistEmails.includes(email)) {
			return res.status(409).json({ message: 'email already in whitelist' })
		}
		misc.whitelistEmails.push(email)
		await misc.save()
		return res.json({ message: 'whitelist email added', whitelistEmails: misc.whitelistEmails })
	})
}

async function deleteWhitelistEmail(req: Request, res: Response) {
	await helpers.runApi(res, async () => {
		const { email } = req.body
		const misc = await Misc.findById(MISC_ID)
		if (!misc) {
			return res.status(404).json({ message: 'data not found' })
		}
		const index = misc.whitelistEmails.indexOf(email)
		if (index === -1) {
			return res.status(404).json({ message: 'email not in whitelist' })
		}
		misc.whitelistEmails.splice(index, 1)
		await misc.save()
		return res.json({ message: 'whitelist email removed', whitelistEmails: misc.whitelistEmails })
	})
}

async function getWhitelistEmailDomains(req: Request, res: Response) {
	await helpers.runApi(res, async () => {
		const misc = await Misc.findById(MISC_ID)
		if (!misc) {
			return res.status(404).json({ message: 'data not found' })
		}
		const whitelistEmailDomains = misc.whitelistEmailDomains ?? []
		return res.json({ whitelistEmailDomains })
	})
}

async function postWhitelistEmailDomain(req: Request, res: Response) {
	await helpers.runApi(res, async () => {
		const { domain } = req.body
		const misc = await Misc.findById(MISC_ID)
		if (!misc) {
			return res.status(404).json({ message: 'data not found' })
		}
		if (misc.whitelistEmailDomains.includes(domain)) {
			return res.status(409).json({ message: 'domain already in whitelist' })
		}
		misc.whitelistEmailDomains.push(domain)
		await misc.save()
		return res.json({ message: 'whitelist email domain added', whitelistEmailDomains: misc.whitelistEmailDomains })
	})
}

async function deleteWhitelistEmailDomain(req: Request, res: Response) {
	await helpers.runApi(res, async () => {
		const { domain } = req.body
		const misc = await Misc.findById(MISC_ID)
		if (!misc) {
			return res.status(404).json({ message: 'data not found' })
		}
		const index = misc.whitelistEmailDomains.indexOf(domain)
		if (index === -1) {
			return res.status(404).json({ message: 'domain not in whitelist' })
		}
		misc.whitelistEmailDomains.splice(index, 1)
		await misc.save()
		return res.json({ message: 'whitelist email domain removed', whitelistEmailDomains: misc.whitelistEmailDomains })
	})
}

const controllers = {
	getWhitelistEmails,
	postWhitelistEmail,
	deleteWhitelistEmail,
	getWhitelistEmailDomains,
	postWhitelistEmailDomain,
	deleteWhitelistEmailDomain
}

export default controllers
