/* -*- Mode: IDL; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
/* This Source Code Form is subject to the terms of the Mozilla Public
 * License, v. 2.0. If a copy of the MPL was not distributed with this
 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */

#include "nsISupports.idl"
#include "nsrootidl.idl"
#include "nsIMsgWindow.idl"
#include "nsIMsgIdentity.idl"
#include "nsIMsgThread.idl"
#include "nsIMsgFolder.idl"

interface nsIMsgDBHdr;
interface nsIDOMWindow;
interface nsITransactionManager;
interface nsIMsgMessageService;
interface nsIFile;
interface nsIUrlListener;

[scriptable, uuid(4e36968b-b476-4f3e-b170-c19fe3d48d0b)]
interface nsIMessenger : nsISupports {

    const long eUnknown = 0;
    const long eDeleteMsg = 1;
    const long eMoveMsg = 2;
    const long eCopyMsg = 3;
    const long eMarkAllMsg = 4;

    void setDisplayCharset(in ACString aCharset);

    readonly attribute nsITransactionManager transactionManager;

    void setWindow(in nsIDOMWindow ptr, in nsIMsgWindow msgWindow);

    void addMsgUrlToNavigateHistory(in ACString aURL);
    void openURL(in ACString aURL);

    /** load a custom message by url, e.g load a attachment as a email
      */
    void loadURL(in nsIDOMWindow ptr, in ACString aURL); 

    void launchExternalURL(in ACString aURL);

    boolean canUndo();
    boolean canRedo();
    unsigned long getUndoTransactionType();
    unsigned long getRedoTransactionType();
    void undo(in nsIMsgWindow msgWindow);
    void redo(in nsIMsgWindow msgWindow);
    void setDocumentCharset(in ACString characterSet);
    /**
     * Saves a given message to a file or template.
     *
     * @param aURI         The URI of the message to save
     * @param aAsFile      If true, save as file, otherwise save as a template
     * @param aIdentity    When saving as a template, this is used to determine
     *                     the location to save the template to.
     * @param aMsgFilename When saving as a file, the filename to save the
     *                     message as, or the default filename for the file
     *                     picker.
     * @param aBypassFilePicker
     *                     If not specified or false, this function will show
     *                     a file picker when saving as a file. If true, no
     *                     file picker will be shown.
     */
    void saveAs(in ACString aURI, in boolean aAsFile,
                in nsIMsgIdentity aIdentity, in AString aMsgFilename,
                [optional] in boolean aBypassFilePicker);

    /**
     * Save the given messages as files in a folder - the user will be prompted
     * for which folder to use.
     * @param count message count
     * @param filenameArray the filenames to use
     * @param messageUriArray uris of the messages to save
     */
    void saveMessages(in unsigned long count,
                      [array, size_is(count)] in wstring filenameArray,
                      [array, size_is(count)] in string messageUriArray);

    void openAttachment(in ACString contentTpe, in ACString url, in ACString displayName, in ACString messageUri, in boolean isExternalAttachment);
    void saveAttachment(in ACString contentTpe, in ACString url, in ACString displayName, in ACString messageUri, in boolean isExternalAttachment);
    void saveAllAttachments(in unsigned long count, [array, size_is(count)] in string contentTypeArray,
                            [array, size_is(count)] in string urlArray, [array, size_is(count)] in string displayNameArray,
                            [array, size_is(count)] in string messageUriArray);
    
    void saveAttachmentToFile(in nsIFile aFile, in ACString aUrl, in ACString aMessageUri, 
                              in ACString aContentType, in nsIUrlListener aListener);

    /**
     * For a single message and attachments, save these attachments to a file, and
     *  remove from the message. No warning windows will appear, so this is
     *  suitable for use in test and filtering.
     *
     * @param aDestFolder       Folder to save files in
     * @param aCount            Number of attachments to save
     * @param aContentTypeArray Content types of the attachments
     * @param aUrlArray         Urls for the attachments
     * @param aDisplayNameArray Files names to save attachments to. Unique
     *                           names will be created if needed.
     * @param aMessageUriArray  Uri for the source message
     * @param aListener         Listener to inform of start and stop of detach
     */
    void detachAttachmentsWOPrompts(in nsIFile aDestFolder,
                                    in unsigned long aCount,
                                    [array, size_is(aCount)] in string aContentTypeArray,
                                    [array, size_is(aCount)] in string aUrlArray,
                                    [array, size_is(aCount)] in string aDisplayNameArray,
                                    [array, size_is(aCount)] in string aMessageUriArray,
                                    in nsIUrlListener aListener);

    void detachAttachment(in string contentTpe, in string url, in string displayName, in string messageUri, in boolean saveFirst, [optional] in boolean withoutWarning);
    void detachAllAttachments(in unsigned long count, [array, size_is(count)] in string contentTypeArray,
                             [array, size_is(count)] in string urlArray, [array, size_is(count)] in string displayNameArray,
                             [array, size_is(count)] in string messageUriArray, in boolean saveFirst, [optional] in boolean withoutWarning);
    // saveAttachmentToFolder is used by the drag and drop code to drop an attachment to a destination folder
    // We need to return the actual file path (including the filename).
    nsIFile saveAttachmentToFolder(in ACString contentType, in ACString url, in ACString displayName, in ACString messageUri, in nsIFile aDestFolder);

    readonly attribute ACString lastDisplayedMessageUri;

    nsIMsgMessageService messageServiceFromURI(in ACString aUri);
    nsIMsgDBHdr msgHdrFromURI(in ACString aUri);
    // For back forward history, we need a list of visited messages,
    // and where we are in the list.
    
    // aPos is relative to the current history cursor - 1 is forward, -1 is back.
    // Unfortunately, you must call this before navigating to this position,
    // because calling this has the side effect of making us adjust our current
    // history pos, and *not* adding the loaded message to the history queue.
    ACString getMsgUriAtNavigatePos(in long aPos);
    ACString getFolderUriAtNavigatePos(in long aPos);
    attribute long navigatePos;
    // If caller just wants the count and cur pos, they can pass in a null history pointer, which will be more efficient
    // if they want a list suitable for display in a back/forward menu drop down, they should pass in a aHistory pointer,
    // and they'll get returned an array with strings containing something like subject and sender of the message - 
    // other possible info is the folder containing the message, and the preview text, if available.
    void getNavigateHistory(out unsigned long aCurPos, out unsigned long aCount, [array, size_is(aCount)] out string aHistory);

    AString formatFileSize(in unsigned long long aPos, [optional] in boolean aUseKB);
};

