<script>
import AjaxLoader from '../AjaxLoader.vue'
import Tags from "bootstrap5-tags"
import commonMixins from '../../mixins/CommonMixins'
import { mailbox } from '../../stores/mailbox'

export default {
	props: {
		message: Object,
	},

	components: {
		AjaxLoader,
	},

	emits: ['delete'],

	data() {
		return {
			addresses: [],
			deleteAfterRelease: false,
			mailbox,
			allAddresses: [],
		}
	},

	mixins: [commonMixins],

	mounted() {
		let a = []
		for (let i in this.message.To) {
			a.push(this.message.To[i].Address)
		}
		for (let i in this.message.Cc) {
			a.push(this.message.Cc[i].Address)
		}
		for (let i in this.message.Bcc) {
			a.push(this.message.Bcc[i].Address)
		}

		// include only unique email addresses, regardless of casing
		this.allAddresses = JSON.parse(JSON.stringify([...new Map(a.map(ad => [ad.toLowerCase(), ad])).values()]))

		this.addresses = this.allAddresses
	},

	methods: {
		// triggered manually after modal is shown
		initTags: function () {
			Tags.init("select[multiple]")
		},

		releaseMessage: function () {
			let self = this
			// set timeout to allow for user clicking send before the tag filter has applied the tag
			window.setTimeout(function () {
				if (!self.addresses.length) {
					return false
				}

				let data = {
					to: self.addresses
				}

				self.post(self.resolve('/api/v1/message/' + self.message.ID + '/release'), data, function (response) {
					self.modal("ReleaseModal").hide()
					if (self.deleteAfterRelease) {
						self.$emit('delete')
					}
				})
			}, 100)
		}
	}
}
</script>

<template>
	<div class="modal fade" id="ReleaseModal" tabindex="-1" aria-labelledby="AppInfoModalLabel" aria-hidden="true">
		<div class="modal-dialog modal-lg" v-if="message">
			<div class="modal-content">
				<div class="modal-header">
					<h1 class="modal-title fs-5" id="AppInfoModalLabel">Release email</h1>
					<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
				</div>
				<div class="modal-body">
					<h6>Send this message to one or more addresses specified below.</h6>
					<div class="row">
						<label class="col-sm-2 col-form-label text-body-secondary">From</label>
						<div class="col-sm-10">
							<input type="text" aria-label="From address" readonly class="form-control-plaintext"
								:value="message.From.Address">
						</div>
					</div>
					<div class="row">
						<label class=" col-sm-2 col-form-label text-body-secondary">Subject</label>
						<div class="col-sm-10">
							<input type="text" aria-label="Subject" readonly class="form-control-plaintext"
								:value="message.Subject">
						</div>
					</div>
					<div class="row mb-3">
						<label class="col-sm-2 col-form-label text-body-secondary">Send to</label>
						<div class="col-sm-10">
							<select class="form-select tag-selector" v-model="addresses" multiple data-allow-new="true"
								data-clear-end="true" data-allow-clear="true" data-placeholder="Enter email addresses..."
								data-add-on-blur="true" data-badge-style="primary"
								data-regex='^(([^<>()[\]\\.,;:\s@"]+(\.[^<>()[\]\\.,;:\s@"]+)*)|.(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$'
								data-separator="|,|">
								<option value="">Enter email addresses...</option>
								<!-- you need at least one option with the placeholder -->
								<option v-for="t in allAddresses" :value="t">{{ t }}</option>
							</select>
							<div class="invalid-feedback">Invalid email address</div>
						</div>
					</div>
					<div class="row mb-3">
						<div class="col-sm-10 offset-sm-2">
							<div class="form-check">
								<input class="form-check-input" type="checkbox" v-model="deleteAfterRelease"
									id="DeleteAfterRelease">
								<label class="form-check-label" for="DeleteAfterRelease">
									Delete the message after release
								</label>
							</div>

						</div>
					</div>
					<div class="form-text text-center" v-if="mailbox.uiConfig.MessageRelay.RecipientAllowlist != ''">
						Note: A recipient allowlist has been configured. Any mail address not matching it will be rejected.
						<br class="d-none d-md-inline">
						Configured allowlist: <b>{{ mailbox.uiConfig.MessageRelay.RecipientAllowlist }}</b>
					</div>
					<div class="form-text text-center">
						Note: For testing purposes, a unique Message-Id will be generated on send.
						<br class="d-none d-md-inline">
						SMTP delivery failures will bounce back to
						<b v-if="mailbox.uiConfig.MessageRelay.ReturnPath != ''">{{ mailbox.uiConfig.MessageRelay.ReturnPath
						}}</b>
						<b v-else>{{ message.ReturnPath }}</b>.
					</div>
				</div>
				<div class="modal-footer">
					<button type="button" class="btn btn-outline-secondary" data-bs-dismiss="modal">Cancel</button>
					<button type="button" class="btn btn-primary" :disabled="!addresses.length"
						v-on:click="releaseMessage">Release</button>
				</div>
			</div>
		</div>
	</div>

	<AjaxLoader :loading="loading" />
</template>