/*
 * Copyright 2018-2023 Amazon.com, Inc. or its affiliates. All Rights Reserved.
 * 
 * Licensed under the Apache License, Version 2.0 (the "License"). You may not use this file except in compliance with
 * the License. A copy of the License is located at
 * 
 * http://aws.amazon.com/apache2.0
 * 
 * or in the "license" file accompanying this file. This file is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR
 * CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions
 * and limitations under the License.
 */
package com.amazonaws.services.pinpoint.model;

import java.io.Serializable;
import javax.annotation.Generated;
import com.amazonaws.protocol.StructuredPojo;
import com.amazonaws.protocol.ProtocolMarshaller;

/**
 * <p>
 * Specifies the default settings and content for a one-time email message that's sent directly to an endpoint.
 * </p>
 * 
 * @see <a href="http://docs.aws.amazon.com/goto/WebAPI/pinpoint-2016-12-01/EmailMessage" target="_top">AWS API
 *      Documentation</a>
 */
@Generated("com.amazonaws:aws-java-sdk-code-generator")
public class EmailMessage implements Serializable, Cloneable, StructuredPojo {

    /**
     * <p>
     * The body of the email message.
     * </p>
     */
    private String body;
    /**
     * <p>
     * The email address to forward bounces and complaints to, if feedback forwarding is enabled.
     * </p>
     */
    private String feedbackForwardingAddress;
    /**
     * <p>
     * The verified email address to send the email message from. The default value is the FromAddress specified for the
     * email channel.
     * </p>
     */
    private String fromAddress;
    /**
     * <p>
     * The email message, represented as a raw MIME message.
     * </p>
     */
    private RawEmail rawEmail;
    /**
     * <p>
     * The reply-to email address(es) for the email message. If a recipient replies to the email, each reply-to address
     * receives the reply.
     * </p>
     */
    private java.util.List<String> replyToAddresses;
    /**
     * <p>
     * The email message, composed of a subject, a text part, and an HTML part.
     * </p>
     */
    private SimpleEmail simpleEmail;
    /**
     * <p>
     * The default message variables to use in the email message. You can override the default variables with individual
     * address variables.
     * </p>
     */
    private java.util.Map<String, java.util.List<String>> substitutions;

    /**
     * <p>
     * The body of the email message.
     * </p>
     * 
     * @param body
     *        The body of the email message.
     */

    public void setBody(String body) {
        this.body = body;
    }

    /**
     * <p>
     * The body of the email message.
     * </p>
     * 
     * @return The body of the email message.
     */

    public String getBody() {
        return this.body;
    }

    /**
     * <p>
     * The body of the email message.
     * </p>
     * 
     * @param body
     *        The body of the email message.
     * @return Returns a reference to this object so that method calls can be chained together.
     */

    public EmailMessage withBody(String body) {
        setBody(body);
        return this;
    }

    /**
     * <p>
     * The email address to forward bounces and complaints to, if feedback forwarding is enabled.
     * </p>
     * 
     * @param feedbackForwardingAddress
     *        The email address to forward bounces and complaints to, if feedback forwarding is enabled.
     */

    public void setFeedbackForwardingAddress(String feedbackForwardingAddress) {
        this.feedbackForwardingAddress = feedbackForwardingAddress;
    }

    /**
     * <p>
     * The email address to forward bounces and complaints to, if feedback forwarding is enabled.
     * </p>
     * 
     * @return The email address to forward bounces and complaints to, if feedback forwarding is enabled.
     */

    public String getFeedbackForwardingAddress() {
        return this.feedbackForwardingAddress;
    }

    /**
     * <p>
     * The email address to forward bounces and complaints to, if feedback forwarding is enabled.
     * </p>
     * 
     * @param feedbackForwardingAddress
     *        The email address to forward bounces and complaints to, if feedback forwarding is enabled.
     * @return Returns a reference to this object so that method calls can be chained together.
     */

    public EmailMessage withFeedbackForwardingAddress(String feedbackForwardingAddress) {
        setFeedbackForwardingAddress(feedbackForwardingAddress);
        return this;
    }

    /**
     * <p>
     * The verified email address to send the email message from. The default value is the FromAddress specified for the
     * email channel.
     * </p>
     * 
     * @param fromAddress
     *        The verified email address to send the email message from. The default value is the FromAddress specified
     *        for the email channel.
     */

    public void setFromAddress(String fromAddress) {
        this.fromAddress = fromAddress;
    }

    /**
     * <p>
     * The verified email address to send the email message from. The default value is the FromAddress specified for the
     * email channel.
     * </p>
     * 
     * @return The verified email address to send the email message from. The default value is the FromAddress specified
     *         for the email channel.
     */

    public String getFromAddress() {
        return this.fromAddress;
    }

    /**
     * <p>
     * The verified email address to send the email message from. The default value is the FromAddress specified for the
     * email channel.
     * </p>
     * 
     * @param fromAddress
     *        The verified email address to send the email message from. The default value is the FromAddress specified
     *        for the email channel.
     * @return Returns a reference to this object so that method calls can be chained together.
     */

    public EmailMessage withFromAddress(String fromAddress) {
        setFromAddress(fromAddress);
        return this;
    }

    /**
     * <p>
     * The email message, represented as a raw MIME message.
     * </p>
     * 
     * @param rawEmail
     *        The email message, represented as a raw MIME message.
     */

    public void setRawEmail(RawEmail rawEmail) {
        this.rawEmail = rawEmail;
    }

    /**
     * <p>
     * The email message, represented as a raw MIME message.
     * </p>
     * 
     * @return The email message, represented as a raw MIME message.
     */

    public RawEmail getRawEmail() {
        return this.rawEmail;
    }

    /**
     * <p>
     * The email message, represented as a raw MIME message.
     * </p>
     * 
     * @param rawEmail
     *        The email message, represented as a raw MIME message.
     * @return Returns a reference to this object so that method calls can be chained together.
     */

    public EmailMessage withRawEmail(RawEmail rawEmail) {
        setRawEmail(rawEmail);
        return this;
    }

    /**
     * <p>
     * The reply-to email address(es) for the email message. If a recipient replies to the email, each reply-to address
     * receives the reply.
     * </p>
     * 
     * @return The reply-to email address(es) for the email message. If a recipient replies to the email, each reply-to
     *         address receives the reply.
     */

    public java.util.List<String> getReplyToAddresses() {
        return replyToAddresses;
    }

    /**
     * <p>
     * The reply-to email address(es) for the email message. If a recipient replies to the email, each reply-to address
     * receives the reply.
     * </p>
     * 
     * @param replyToAddresses
     *        The reply-to email address(es) for the email message. If a recipient replies to the email, each reply-to
     *        address receives the reply.
     */

    public void setReplyToAddresses(java.util.Collection<String> replyToAddresses) {
        if (replyToAddresses == null) {
            this.replyToAddresses = null;
            return;
        }

        this.replyToAddresses = new java.util.ArrayList<String>(replyToAddresses);
    }

    /**
     * <p>
     * The reply-to email address(es) for the email message. If a recipient replies to the email, each reply-to address
     * receives the reply.
     * </p>
     * <p>
     * <b>NOTE:</b> This method appends the values to the existing list (if any). Use
     * {@link #setReplyToAddresses(java.util.Collection)} or {@link #withReplyToAddresses(java.util.Collection)} if you
     * want to override the existing values.
     * </p>
     * 
     * @param replyToAddresses
     *        The reply-to email address(es) for the email message. If a recipient replies to the email, each reply-to
     *        address receives the reply.
     * @return Returns a reference to this object so that method calls can be chained together.
     */

    public EmailMessage withReplyToAddresses(String... replyToAddresses) {
        if (this.replyToAddresses == null) {
            setReplyToAddresses(new java.util.ArrayList<String>(replyToAddresses.length));
        }
        for (String ele : replyToAddresses) {
            this.replyToAddresses.add(ele);
        }
        return this;
    }

    /**
     * <p>
     * The reply-to email address(es) for the email message. If a recipient replies to the email, each reply-to address
     * receives the reply.
     * </p>
     * 
     * @param replyToAddresses
     *        The reply-to email address(es) for the email message. If a recipient replies to the email, each reply-to
     *        address receives the reply.
     * @return Returns a reference to this object so that method calls can be chained together.
     */

    public EmailMessage withReplyToAddresses(java.util.Collection<String> replyToAddresses) {
        setReplyToAddresses(replyToAddresses);
        return this;
    }

    /**
     * <p>
     * The email message, composed of a subject, a text part, and an HTML part.
     * </p>
     * 
     * @param simpleEmail
     *        The email message, composed of a subject, a text part, and an HTML part.
     */

    public void setSimpleEmail(SimpleEmail simpleEmail) {
        this.simpleEmail = simpleEmail;
    }

    /**
     * <p>
     * The email message, composed of a subject, a text part, and an HTML part.
     * </p>
     * 
     * @return The email message, composed of a subject, a text part, and an HTML part.
     */

    public SimpleEmail getSimpleEmail() {
        return this.simpleEmail;
    }

    /**
     * <p>
     * The email message, composed of a subject, a text part, and an HTML part.
     * </p>
     * 
     * @param simpleEmail
     *        The email message, composed of a subject, a text part, and an HTML part.
     * @return Returns a reference to this object so that method calls can be chained together.
     */

    public EmailMessage withSimpleEmail(SimpleEmail simpleEmail) {
        setSimpleEmail(simpleEmail);
        return this;
    }

    /**
     * <p>
     * The default message variables to use in the email message. You can override the default variables with individual
     * address variables.
     * </p>
     * 
     * @return The default message variables to use in the email message. You can override the default variables with
     *         individual address variables.
     */

    public java.util.Map<String, java.util.List<String>> getSubstitutions() {
        return substitutions;
    }

    /**
     * <p>
     * The default message variables to use in the email message. You can override the default variables with individual
     * address variables.
     * </p>
     * 
     * @param substitutions
     *        The default message variables to use in the email message. You can override the default variables with
     *        individual address variables.
     */

    public void setSubstitutions(java.util.Map<String, java.util.List<String>> substitutions) {
        this.substitutions = substitutions;
    }

    /**
     * <p>
     * The default message variables to use in the email message. You can override the default variables with individual
     * address variables.
     * </p>
     * 
     * @param substitutions
     *        The default message variables to use in the email message. You can override the default variables with
     *        individual address variables.
     * @return Returns a reference to this object so that method calls can be chained together.
     */

    public EmailMessage withSubstitutions(java.util.Map<String, java.util.List<String>> substitutions) {
        setSubstitutions(substitutions);
        return this;
    }

    /**
     * Add a single Substitutions entry
     *
     * @see EmailMessage#withSubstitutions
     * @returns a reference to this object so that method calls can be chained together.
     */

    public EmailMessage addSubstitutionsEntry(String key, java.util.List<String> value) {
        if (null == this.substitutions) {
            this.substitutions = new java.util.HashMap<String, java.util.List<String>>();
        }
        if (this.substitutions.containsKey(key))
            throw new IllegalArgumentException("Duplicated keys (" + key.toString() + ") are provided.");
        this.substitutions.put(key, value);
        return this;
    }

    /**
     * Removes all the entries added into Substitutions.
     *
     * @return Returns a reference to this object so that method calls can be chained together.
     */

    public EmailMessage clearSubstitutionsEntries() {
        this.substitutions = null;
        return this;
    }

    /**
     * Returns a string representation of this object. This is useful for testing and debugging. Sensitive data will be
     * redacted from this string using a placeholder value.
     *
     * @return A string representation of this object.
     *
     * @see java.lang.Object#toString()
     */
    @Override
    public String toString() {
        StringBuilder sb = new StringBuilder();
        sb.append("{");
        if (getBody() != null)
            sb.append("Body: ").append(getBody()).append(",");
        if (getFeedbackForwardingAddress() != null)
            sb.append("FeedbackForwardingAddress: ").append(getFeedbackForwardingAddress()).append(",");
        if (getFromAddress() != null)
            sb.append("FromAddress: ").append(getFromAddress()).append(",");
        if (getRawEmail() != null)
            sb.append("RawEmail: ").append(getRawEmail()).append(",");
        if (getReplyToAddresses() != null)
            sb.append("ReplyToAddresses: ").append(getReplyToAddresses()).append(",");
        if (getSimpleEmail() != null)
            sb.append("SimpleEmail: ").append(getSimpleEmail()).append(",");
        if (getSubstitutions() != null)
            sb.append("Substitutions: ").append(getSubstitutions());
        sb.append("}");
        return sb.toString();
    }

    @Override
    public boolean equals(Object obj) {
        if (this == obj)
            return true;
        if (obj == null)
            return false;

        if (obj instanceof EmailMessage == false)
            return false;
        EmailMessage other = (EmailMessage) obj;
        if (other.getBody() == null ^ this.getBody() == null)
            return false;
        if (other.getBody() != null && other.getBody().equals(this.getBody()) == false)
            return false;
        if (other.getFeedbackForwardingAddress() == null ^ this.getFeedbackForwardingAddress() == null)
            return false;
        if (other.getFeedbackForwardingAddress() != null && other.getFeedbackForwardingAddress().equals(this.getFeedbackForwardingAddress()) == false)
            return false;
        if (other.getFromAddress() == null ^ this.getFromAddress() == null)
            return false;
        if (other.getFromAddress() != null && other.getFromAddress().equals(this.getFromAddress()) == false)
            return false;
        if (other.getRawEmail() == null ^ this.getRawEmail() == null)
            return false;
        if (other.getRawEmail() != null && other.getRawEmail().equals(this.getRawEmail()) == false)
            return false;
        if (other.getReplyToAddresses() == null ^ this.getReplyToAddresses() == null)
            return false;
        if (other.getReplyToAddresses() != null && other.getReplyToAddresses().equals(this.getReplyToAddresses()) == false)
            return false;
        if (other.getSimpleEmail() == null ^ this.getSimpleEmail() == null)
            return false;
        if (other.getSimpleEmail() != null && other.getSimpleEmail().equals(this.getSimpleEmail()) == false)
            return false;
        if (other.getSubstitutions() == null ^ this.getSubstitutions() == null)
            return false;
        if (other.getSubstitutions() != null && other.getSubstitutions().equals(this.getSubstitutions()) == false)
            return false;
        return true;
    }

    @Override
    public int hashCode() {
        final int prime = 31;
        int hashCode = 1;

        hashCode = prime * hashCode + ((getBody() == null) ? 0 : getBody().hashCode());
        hashCode = prime * hashCode + ((getFeedbackForwardingAddress() == null) ? 0 : getFeedbackForwardingAddress().hashCode());
        hashCode = prime * hashCode + ((getFromAddress() == null) ? 0 : getFromAddress().hashCode());
        hashCode = prime * hashCode + ((getRawEmail() == null) ? 0 : getRawEmail().hashCode());
        hashCode = prime * hashCode + ((getReplyToAddresses() == null) ? 0 : getReplyToAddresses().hashCode());
        hashCode = prime * hashCode + ((getSimpleEmail() == null) ? 0 : getSimpleEmail().hashCode());
        hashCode = prime * hashCode + ((getSubstitutions() == null) ? 0 : getSubstitutions().hashCode());
        return hashCode;
    }

    @Override
    public EmailMessage clone() {
        try {
            return (EmailMessage) super.clone();
        } catch (CloneNotSupportedException e) {
            throw new IllegalStateException("Got a CloneNotSupportedException from Object.clone() " + "even though we're Cloneable!", e);
        }
    }

    @com.amazonaws.annotation.SdkInternalApi
    @Override
    public void marshall(ProtocolMarshaller protocolMarshaller) {
        com.amazonaws.services.pinpoint.model.transform.EmailMessageMarshaller.getInstance().marshall(this, protocolMarshaller);
    }
}
