
import { ParseMime } from 'Mime/Parser';
import { AttachmentModel } from 'Model/Attachment';
import { EmailModel } from 'Model/Email';
import { FileInfo } from 'Common/File';
import { BEGIN_PGP_MESSAGE } from 'Stores/User/Pgp';

/**
 * @param string data
 * @param MessageModel message
 */
export function MimeToMessage(data, message)
{
	let signed;
	const struct = ParseMime(data);
	if (struct.headers) {
		let html = struct.getByContentType('text/html');
		html = html ? html.body : '';

		if (struct.headers.subject) {
			message.subject(struct.headers.subject.value);
		}
		['from','to'].forEach(name => {
			if (struct.headers[name] && !message[name].length) {
				let mail = new EmailModel;
				mail.parse(struct.headers[name].value);
				message[name].push(mail);
			}
		});

		struct.forEach(part => {
			let cd = part.header('content-disposition'),
				cid = part.header('content-id'),
				type = part.header('content-type');
			if (cid || cd) {
				// if (cd && 'attachment' === cd.value) {
				let attachment = new AttachmentModel;
				attachment.mimeType = type.value;
				attachment.fileName = type.name || (cd && cd.params.filename) || '';
				attachment.fileNameExt = attachment.fileName.replace(/^.+(\.[a-z]+)$/, '$1');
				attachment.fileType = FileInfo.getType('', type.value);
				attachment.url = part.dataUrl;
				attachment.friendlySize = FileInfo.friendlySize(part.body.length);
/*
				attachment.isThumbnail = false;
				attachment.contentLocation = '';
				attachment.download = '';
				attachment.folder = '';
				attachment.uid = '';
				attachment.mimeIndex = part.id;
				attachment.framed = false;
*/
				attachment.cid = cid ? cid.value : '';
				if (cid && html) {
					let cid = 'cid:' + attachment.contentId(),
						found = html.includes(cid);
					attachment.isInline(found);
					attachment.isLinked(found);
					found && (html = html
						.replace('src="' + cid + '"', 'src="' + attachment.url + '"')
						.replace("src='" + cid + "'", "src='" + attachment.url + "'")
					);
				} else {
					message.attachments.push(attachment);
				}
			} else if ('multipart/signed' === type.value && 'application/pgp-signature' === type.params.protocol) {
				signed = {
					MicAlg: type.micalg,
					BodyPart: part.parts[0],
					SigPart: part.parts[1]
				};
			}
		});

		const text = struct.getByContentType('text/plain');
		message.plain(text ? text.body : '');
		message.html(html);
	} else {
		message.plain(data);
	}

	if (!signed && message.plain().includes(BEGIN_PGP_MESSAGE)) {
		signed = true;
	}
	message.pgpSigned(signed);

	// TODO: Verify instantly?
}
