package tech.blueglacier.parser;

import tech.blueglacier.email.Email;
import tech.blueglacier.email.EmailMessageType;
import tech.blueglacier.email.EmailMessageType.EmailMessageTypeHierarchy;
import tech.blueglacier.email.MultipartType;
import org.apache.james.mime4j.MimeException;
import org.apache.james.mime4j.parser.AbstractContentHandler;
import org.apache.james.mime4j.stream.BodyDescriptor;
import org.apache.james.mime4j.stream.Field;

import java.io.IOException;
import java.io.InputStream;

public class CustomContentHandler extends AbstractContentHandler {

    private Email email;

    public CustomContentHandler() {
        this.email = new Email();
    }

    public Email getEmail() {
        return email;
    }

    @Override
    public void field(Field field) throws MimeException {
        email.getHeader().addField(field);
    }

    @Override
    public void body(BodyDescriptor bd, InputStream is) throws MimeException, IOException {
        // Gracefully switching off the case of email attached within an email
        if (email.getMessageStack().peek().getEmailMessageTypeHierarchy() == EmailMessageTypeHierarchy.parent) {
            email.fillEmailContents(bd, is);
        }
    }

    @Override
    public void startMessage() throws MimeException {
        if (email.getMessageStack().empty()) {
            email.getMessageStack().push(new EmailMessageType(EmailMessageTypeHierarchy.parent));
        } else {
            email.getMessageStack().push(new EmailMessageType(EmailMessageTypeHierarchy.child));
        }
    }

    @Override
    public void endMessage() {
        if (email.getMessageStack().peek().getEmailMessageTypeHierarchy() == EmailMessageTypeHierarchy.parent) {
            email.reArrangeEmail();
        }
        email.getMessageStack().pop();
    }

    public void endMultipart() throws MimeException {
        email.getMultipartStack().pop();
    }

    public void startMultipart(BodyDescriptor bd) throws MimeException {
        email.getMultipartStack().push(new MultipartType(bd));
    }
}