#ifndef MAILCORE_MCMESSAGECONSTANTS_H

#define MAILCORE_MCMESSAGECONSTANTS_H

#ifdef __cplusplus

namespace mailcore {
    
    enum ConnectionType {
        ConnectionTypeClear             = 1 << 0,
        ConnectionTypeStartTLS          = 1 << 1,
        ConnectionTypeTLS               = 1 << 2,
    };
    
    enum AuthType {
        AuthTypeSASLNone          = 0,
        AuthTypeSASLCRAMMD5       = 1 << 0,
        AuthTypeSASLPlain         = 1 << 1,
        AuthTypeSASLGSSAPI        = 1 << 2,
        AuthTypeSASLDIGESTMD5     = 1 << 3,
        AuthTypeSASLLogin         = 1 << 4,
        AuthTypeSASLSRP           = 1 << 5,
        AuthTypeSASLNTLM          = 1 << 6,
        AuthTypeSASLKerberosV4    = 1 << 7,
        AuthTypeXOAuth2           = 1 << 8,
    };
    
    enum IMAPFolderFlag {
        IMAPFolderFlagNone        = 0,
        IMAPFolderFlagMarked      = 1 << 0,
        IMAPFolderFlagUnmarked    = 1 << 1,
        IMAPFolderFlagNoSelect    = 1 << 2,
        IMAPFolderFlagNoInferiors = 1 << 3,
        IMAPFolderFlagInbox       = 1 << 4,
        IMAPFolderFlagSentMail    = 1 << 5,
        IMAPFolderFlagStarred     = 1 << 6,
        IMAPFolderFlagAllMail     = 1 << 7,
        IMAPFolderFlagTrash       = 1 << 8,
        IMAPFolderFlagDrafts      = 1 << 9,
        IMAPFolderFlagSpam        = 1 << 10,
        IMAPFolderFlagImportant   = 1 << 11,
        IMAPFolderFlagArchive     = 1 << 12,
        IMAPFolderFlagAll = IMAPFolderFlagAllMail,
        IMAPFolderFlagJunk = IMAPFolderFlagSpam,
        IMAPFolderFlagFlagged = IMAPFolderFlagStarred,
        IMAPFolderFlagFolderTypeMask = IMAPFolderFlagInbox | IMAPFolderFlagSentMail | IMAPFolderFlagStarred | IMAPFolderFlagAllMail |
          IMAPFolderFlagTrash| IMAPFolderFlagDrafts | IMAPFolderFlagSpam | IMAPFolderFlagImportant | IMAPFolderFlagArchive,
    };
    
    enum MessageFlag {
        MessageFlagNone          = 0,
        MessageFlagSeen          = 1 << 0,
        MessageFlagAnswered      = 1 << 1,
        MessageFlagFlagged       = 1 << 2,
        MessageFlagDeleted       = 1 << 3,
        MessageFlagDraft         = 1 << 4,
        MessageFlagMDNSent       = 1 << 5,
        MessageFlagForwarded     = 1 << 6,
        MessageFlagSubmitPending = 1 << 7,
        MessageFlagSubmitted     = 1 << 8,
    } ;
    
    enum IMAPMessagesRequestKind {
        IMAPMessagesRequestKindUid           = 0, // This is the default and it's always fetched
        IMAPMessagesRequestKindFlags         = 1 << 0,
        IMAPMessagesRequestKindHeaders       = 1 << 1,
        IMAPMessagesRequestKindStructure     = 1 << 2,
        IMAPMessagesRequestKindInternalDate  = 1 << 3,
        IMAPMessagesRequestKindFullHeaders   = 1 << 4,
        IMAPMessagesRequestKindHeaderSubject = 1 << 5,
        IMAPMessagesRequestKindGmailLabels   = 1 << 6,
        IMAPMessagesRequestKindGmailMessageID = 1 << 7,
        IMAPMessagesRequestKindGmailThreadID  = 1 << 8,
        IMAPMessagesRequestKindExtraHeaders  = 1 << 9,
        IMAPMessagesRequestKindSize          = 1 << 10,
    };
    
    enum IMAPFetchRequestType {
        IMAPFetchRequestTypeUID = 0,
        IMAPFetchRequestTypeSequence = 1
    };
    
    enum IMAPStoreFlagsRequestKind {
        IMAPStoreFlagsRequestKindAdd,
        IMAPStoreFlagsRequestKindRemove,
        IMAPStoreFlagsRequestKindSet,
    };
    
    enum IMAPWorkaround {
        IMAPWorkaroundGmail = 1 << 0,
        IMAPWorkaroundYahoo = 1 << 1,
        IMAPWorkaroundExchange2003 = 1 << 2,
    };
    
    enum IMAPCapability {
        IMAPCapabilityACL,
        IMAPCapabilityBinary,
        IMAPCapabilityCatenate,
        IMAPCapabilityChildren,
        IMAPCapabilityCompressDeflate,
        IMAPCapabilityCondstore,
        IMAPCapabilityEnable,
        IMAPCapabilityIdle,
        IMAPCapabilityId,
        IMAPCapabilityLiteralPlus,
        IMAPCapabilityMultiAppend,
        IMAPCapabilityNamespace,
        IMAPCapabilityQResync,
        IMAPCapabilityQuota,
        IMAPCapabilitySort,
        IMAPCapabilityStartTLS,
        IMAPCapabilityThreadOrderedSubject,
        IMAPCapabilityThreadReferences,
        IMAPCapabilityUIDPlus,
        IMAPCapabilityUnselect,
        IMAPCapabilityXList,
        IMAPCapabilityAuthAnonymous,
        IMAPCapabilityAuthCRAMMD5,
        IMAPCapabilityAuthDigestMD5,
        IMAPCapabilityAuthExternal,
        IMAPCapabilityAuthGSSAPI,
        IMAPCapabilityAuthKerberosV4,
        IMAPCapabilityAuthLogin,
        IMAPCapabilityAuthNTLM,
        IMAPCapabilityAuthOTP,
        IMAPCapabilityAuthPlain,
        IMAPCapabilityAuthSKey,
        IMAPCapabilityAuthSRP,
        IMAPCapabilityXOAuth2,
        IMAPCapabilityGmail,
    };
    
    enum POPCapability {
        POPCapabilityNone,
        POPCapabilityStartTLS,
        POPCapabilityTop,
        POPCapabilityUser,
        POPCapabilityRespCodes,
        POPCapabilityPipelining,
        POPCapabilityUIDL,
        POPCapabilitySASL,
        POPCapabilityAuthAnonymous,
        POPCapabilityAuthCRAMMD5,
        POPCapabilityAuthDigestMD5,
        POPCapabilityAuthExternal,
        POPCapabilityAuthGSSAPI,
        POPCapabilityAuthKerberosV4,
        POPCapabilityAuthLogin,
        POPCapabilityAuthNTLM,
        POPCapabilityAuthOTP,
        POPCapabilityAuthPlain,
        POPCapabilityAuthSKey,
        POPCapabilityAuthSRP,
    };
    
    enum Encoding {
        Encoding7Bit = 0,            // should match MAILIMAP_BODY_FLD_ENC_7BIT
        Encoding8Bit = 1,            // should match MAILIMAP_BODY_FLD_ENC_8BIT
        EncodingBinary = 2,          // should match MAILIMAP_BODY_FLD_ENC_BINARY
        EncodingBase64 = 3,          // should match MAILIMAP_BODY_FLD_ENC_BASE64
        EncodingQuotedPrintable = 4, // should match MAILIMAP_BODY_FLD_ENC_QUOTED_PRINTABLE
        EncodingOther = 5,           // should match MAILIMAP_BODY_FLD_ENC_OTHER
        // negative values should be used for other encoding
        EncodingUUEncode = -1
    };
    
    enum IMAPSearchKind {
        IMAPSearchKindAll,
        IMAPSearchKindNone,
        IMAPSearchKindFrom,
        IMAPSearchKindTo,
        IMAPSearchKindCc,
        IMAPSearchKindBcc,
        IMAPSearchKindRecipient,   // Recipient is the combination of To, Cc and Bcc
        IMAPSearchKindSubject,
        IMAPSearchKindContent,
        IMAPSearchKindUIDs,
        IMAPSearchKindHeader,
        IMAPSearchKindRead,
        IMAPSearchKindUnread,
        IMAPSearchKindFlagged,
        IMAPSearchKindUnflagged,
        IMAPSearchKindAnswered,
        IMAPSearchKindUnanswered,
        IMAPSearchKindDraft,
        IMAPSearchKindUndraft,
        IMAPSearchKindDeleted,
        IMAPSearchKindSpam,
        IMAPSearchKindBeforeDate,
        IMAPSearchKindOnDate,
        IMAPSearchKindSinceDate,
        IMAPSearchKindBeforeReceivedDate,
        IMAPSearchKindOnReceivedDate,
        IMAPSearchKindSinceReceivedDate,
        IMAPSearchKindSizeLarger,
        IMAPSearchKindSizeSmaller,
        IMAPSearchKindGmailThreadID,
        IMAPSearchKindGmailRaw,
        IMAPSearchKindOr,
        IMAPSearchKindAnd,
    };
    
    enum ErrorCode {
        ErrorNone,
        ErrorConnection,
        ErrorTLSNotAvailable,
        ErrorParse,
        ErrorCertificate,
        ErrorAuthentication,
        ErrorGmailIMAPNotEnabled,
        ErrorGmailExceededBandwidthLimit,
        ErrorGmailTooManySimultaneousConnections,
        ErrorMobileMeMoved,
        ErrorYahooUnavailable,
        ErrorNonExistantFolder,
        ErrorRename,
        ErrorDelete,
        ErrorCreate,
        ErrorSubscribe,
        ErrorAppend,
        ErrorCopy,
        ErrorExpunge,
        ErrorFetch,
        ErrorIdle,
        ErrorIdentity,
        ErrorNamespace,
        ErrorStore,
        ErrorCapability,
        ErrorStartTLSNotAvailable,
        ErrorSendMessageIllegalAttachment,
        ErrorStorageLimit,
        ErrorSendMessageNotAllowed,
        ErrorNeedsConnectToWebmail,
        ErrorSendMessage,
        ErrorAuthenticationRequired,
        ErrorFetchMessageList,
        ErrorDeleteMessage,
        ErrorInvalidAccount,
        ErrorFile,
        ErrorCompression,
        ErrorNoSender,
        ErrorNoRecipient,
        ErrorNoop,
    };
    
    enum PartType {
        PartTypeSingle,
        PartTypeMessage,
        PartTypeMultipartMixed,
        PartTypeMultipartRelated,
        PartTypeMultipartAlternative,
    };
    
    // Private type - It should not be used directly.
    enum IMAPMessageRenderingType {
        IMAPMessageRenderingTypeHTML,
        IMAPMessageRenderingTypeHTMLBody,
        IMAPMessageRenderingTypePlainText,
        IMAPMessageRenderingTypePlainTextBody,
        IMAPMessageRenderingTypePlainTextBodyAndStripWhitespace,
    };
    
}

#endif

#endif
