package net.sargue.mailgun;

import org.glassfish.jersey.media.multipart.FormDataBodyPart;
import org.glassfish.jersey.media.multipart.FormDataMultiPart;
import org.glassfish.jersey.media.multipart.MultiPartFeature;

import javax.ws.rs.client.Entity;
import javax.ws.rs.client.WebTarget;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Map;

class MailMultipart extends Mail {
    private final FormDataMultiPart form;

    MailMultipart(Configuration configuration, FormDataMultiPart form) {
        super(configuration);
        this.form = form;
    }

    @Override
    public String getFirstValue(String param) {
        FormDataBodyPart bodyPart = form.getField(param);
        return bodyPart == null ? null : bodyPart.getValue();
    }

    @Override
    public List<String> getValues(String param) {
        List<FormDataBodyPart> bodyParts = form.getFields(param);
        if (bodyParts == null) return Collections.emptyList();

        List<String> values = new ArrayList<>(bodyParts.size());
        for (FormDataBodyPart bodyPart : bodyParts)
            values.add(bodyPart.getValue());
        return values;
    }

    @Override
    Entity<?> entity() {
        return Entity.entity(form, form.getMediaType());
    }

    @Override
    void prepareSend() {
        // apply default parameters
        Map<String, List<String>> def = configuration().defaultParameters();
        for (Map.Entry<String, List<String>> entry : def.entrySet())
            if (form.getField(entry.getKey()) == null)
                for (String value : entry.getValue())
                    form.field(entry.getKey(), value);
    }

    @Override
    void configureTarget(WebTarget target) {
        target.register(MultiPartFeature.class);
    }
}