/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/* 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 "MailNewsTypes2.idl"

interface nsIMsgFolder;

interface nsIMsgDatabase;
interface nsIMsgDBHdr;

[scriptable, uuid(6e893e59-af98-4f62-a326-0f00f32147cd)]

interface nsMsgSearchScope {
  const nsMsgSearchScopeValue offlineMail = 0;
  const nsMsgSearchScopeValue offlineMailFilter = 1;
  const nsMsgSearchScopeValue onlineMail = 2;
  const nsMsgSearchScopeValue onlineMailFilter = 3;
  /// offline news, base table, no body or junk
  const nsMsgSearchScopeValue localNews = 4;
  const nsMsgSearchScopeValue news = 5;
  const nsMsgSearchScopeValue newsEx = 6;
  const nsMsgSearchScopeValue LDAP = 7;
  const nsMsgSearchScopeValue LocalAB = 8;
  const nsMsgSearchScopeValue allSearchableGroups = 9;
  const nsMsgSearchScopeValue newsFilter = 10;
  const nsMsgSearchScopeValue LocalABAnd = 11;
  const nsMsgSearchScopeValue LDAPAnd = 12;
  // IMAP and NEWS, searched using local headers
  const nsMsgSearchScopeValue onlineManual = 13;
  /// local news + junk
  const nsMsgSearchScopeValue localNewsJunk = 14;
  /// local news + body
  const nsMsgSearchScopeValue localNewsBody = 15;
  /// local news + junk + body
  const nsMsgSearchScopeValue localNewsJunkBody = 16;
};

typedef long nsMsgSearchAttribValue;

/**
 * Definitions of search attribute types. The numerical order
 * from here will also be used to determine the order that the
 * attributes display in the filter editor.
 */
[scriptable, uuid(a83ca7e8-4591-4111-8fb8-fd76ac73c866)]
interface nsMsgSearchAttrib {
    const nsMsgSearchAttribValue Custom = -2;  /* a custom term, see nsIMsgSearchCustomTerm */
    const nsMsgSearchAttribValue Default = -1;
    const nsMsgSearchAttribValue Subject = 0;  /* mail and news */
    const nsMsgSearchAttribValue Sender = 1;
    const nsMsgSearchAttribValue Body = 2;
    const nsMsgSearchAttribValue Date = 3;

    const nsMsgSearchAttribValue Priority = 4;      /* mail only */
    const nsMsgSearchAttribValue MsgStatus = 5;
    const nsMsgSearchAttribValue To = 6;
    const nsMsgSearchAttribValue CC = 7;
    const nsMsgSearchAttribValue ToOrCC = 8;
    const nsMsgSearchAttribValue AllAddresses = 9;

    const nsMsgSearchAttribValue Location = 10;          /* result list only */
    const nsMsgSearchAttribValue MessageKey = 11;        /* message result elems */
    const nsMsgSearchAttribValue AgeInDays = 12;
    const nsMsgSearchAttribValue FolderInfo = 13;        /* for "view thread context" from result */
    const nsMsgSearchAttribValue Size = 14;
    const nsMsgSearchAttribValue AnyText = 15;
    const nsMsgSearchAttribValue Keywords = 16; // keywords are the internal representation of tags.

    const nsMsgSearchAttribValue Name = 17;
    const nsMsgSearchAttribValue DisplayName = 18;
    const nsMsgSearchAttribValue Nickname = 19;
    const nsMsgSearchAttribValue ScreenName = 20;
    const nsMsgSearchAttribValue Email = 21;
    const nsMsgSearchAttribValue AdditionalEmail = 22;
    const nsMsgSearchAttribValue PhoneNumber = 23;
    const nsMsgSearchAttribValue WorkPhone = 24;
    const nsMsgSearchAttribValue HomePhone = 25;
    const nsMsgSearchAttribValue Fax = 26;
    const nsMsgSearchAttribValue Pager = 27;
    const nsMsgSearchAttribValue Mobile = 28;
    const nsMsgSearchAttribValue City = 29;
    const nsMsgSearchAttribValue Street = 30;
    const nsMsgSearchAttribValue Title = 31;
    const nsMsgSearchAttribValue Organization = 32;
    const nsMsgSearchAttribValue Department = 33;

    // 34 - 43, reserved for ab / LDAP;
    const nsMsgSearchAttribValue HasAttachmentStatus = 44;
    const nsMsgSearchAttribValue JunkStatus = 45;
    const nsMsgSearchAttribValue JunkPercent = 46;
    const nsMsgSearchAttribValue JunkScoreOrigin = 47;
    const nsMsgSearchAttribValue Label = 48; /* mail only...can search by label */
    const nsMsgSearchAttribValue HdrProperty = 49; // uses nsIMsgSearchTerm::hdrProperty
    const nsMsgSearchAttribValue FolderFlag = 50; // uses nsIMsgSearchTerm::status
    const nsMsgSearchAttribValue Uint32HdrProperty = 51; // uses nsIMsgSearchTerm::hdrProperty

    // 52 is for showing customize - in ui headers start from 53 onwards up until 99.

     /** OtherHeader MUST ALWAYS BE LAST attribute since 
       * we can have an arbitrary # of these. The number can be changed,
       * however, because we never persist AttribValues as integers.
      */
    const nsMsgSearchAttribValue OtherHeader = 52; 
    // must be last attribute
    const nsMsgSearchAttribValue kNumMsgSearchAttributes = 100;
};

typedef long nsMsgSearchOpValue;

[scriptable, uuid(9160b196-6fcb-4eba-aaaf-6c806c4ee420)]
interface nsMsgSearchOp {
    const nsMsgSearchOpValue Contains = 0; /* for text attributes      */
    const nsMsgSearchOpValue DoesntContain = 1;
    const nsMsgSearchOpValue Is = 2; /* is and isn't also apply to some non-text attrs */
    const nsMsgSearchOpValue Isnt = 3;
    const nsMsgSearchOpValue IsEmpty = 4;

    const nsMsgSearchOpValue IsBefore = 5; /* for date attributes              */
    const nsMsgSearchOpValue IsAfter = 6;

    const nsMsgSearchOpValue IsHigherThan = 7; /* for priority. Is also applies  */
    const nsMsgSearchOpValue IsLowerThan = 8;

    const nsMsgSearchOpValue BeginsWith = 9;
    const nsMsgSearchOpValue EndsWith = 10;

    const nsMsgSearchOpValue SoundsLike = 11; /* for LDAP phoenetic matching      */
    const nsMsgSearchOpValue LdapDwim = 12; /* Do What I Mean for simple search */

    const nsMsgSearchOpValue IsGreaterThan = 13;
    const nsMsgSearchOpValue IsLessThan = 14;

    const nsMsgSearchOpValue NameCompletion = 15; /* Name Completion operator...as the name implies =) */
    const nsMsgSearchOpValue IsInAB = 16;
    const nsMsgSearchOpValue IsntInAB = 17;
    const nsMsgSearchOpValue IsntEmpty = 18; /* primarily for tags */
    const nsMsgSearchOpValue Matches = 19; /* generic term for use by custom terms */
    const nsMsgSearchOpValue DoesntMatch = 20; /* generic term for use by custom terms */
    const nsMsgSearchOpValue kNumMsgSearchOperators  = 21;     /* must be last operator */
};

typedef long nsMsgSearchWidgetValue;

/* FEs use this to help build the search dialog box */
[scriptable,uuid(903dd2e8-304e-11d3-92e6-00a0c900d445)]
interface nsMsgSearchWidget {
    const nsMsgSearchWidgetValue Text = 0;
    const nsMsgSearchWidgetValue Date = 1;
    const nsMsgSearchWidgetValue Menu = 2;
  const nsMsgSearchWidgetValue Int = 3;          /* added to account for age in days which requires an integer field */
    const nsMsgSearchWidgetValue None = 4;
};

typedef long nsMsgSearchTypeValue;


/* Used to specify type of search to be performed */
[scriptable,uuid(964b7f32-304e-11d3-ae13-00a0c900d445)]
interface nsMsgSearchType {
  const nsMsgSearchTypeValue None = 0;
  const nsMsgSearchTypeValue RootDSE = 1;
  const nsMsgSearchTypeValue Normal = 2;
  const nsMsgSearchTypeValue LdapVLV = 3;
  const nsMsgSearchTypeValue NameCompletion = 4;
};

typedef long nsMsgSearchBooleanOperator;

[scriptable, uuid(a37f3f4a-304e-11d3-8f94-00a0c900d445)]
interface nsMsgSearchBooleanOp {
    const nsMsgSearchBooleanOperator BooleanOR = 0;
    const nsMsgSearchBooleanOperator BooleanAND = 1;
};

/* Use this to specify the value of a search term */

[ptr] native nsMsgSearchValue(nsMsgSearchValue);

%{C++
#include "nsStringGlue.h"

typedef struct nsMsgSearchValue
{
    nsMsgSearchAttribValue attribute;
    union
    {
      nsMsgPriorityValue priority;
      PRTime date;
      uint32_t msgStatus; /* see MSG_FLAG in msgcom.h */
      uint32_t size;
      nsMsgKey key;
      int32_t age; /* in days */
      nsIMsgFolder *folder;
      nsMsgLabelValue label;
      uint32_t junkStatus;
      uint32_t junkPercent;
    } u;
    char *string;
    nsString utf16String;
} nsMsgSearchValue;
%}

[ptr] native nsMsgSearchTerm(nsMsgSearchTerm);

// Please note the ! at the start of this macro, which means the macro
// needs to enumerate the non-string attributes.
%{C++
#define IS_STRING_ATTRIBUTE(_a) \
(!(_a == nsMsgSearchAttrib::Priority || _a == nsMsgSearchAttrib::Date || \
   _a == nsMsgSearchAttrib::MsgStatus || _a == nsMsgSearchAttrib::MessageKey || \
   _a == nsMsgSearchAttrib::Size || _a == nsMsgSearchAttrib::AgeInDays || \
   _a == nsMsgSearchAttrib::FolderInfo || _a == nsMsgSearchAttrib::Location || \
   _a == nsMsgSearchAttrib::Label || _a == nsMsgSearchAttrib::JunkStatus || \
   _a == nsMsgSearchAttrib::FolderFlag || _a == nsMsgSearchAttrib::Uint32HdrProperty || \
   _a == nsMsgSearchAttrib::JunkPercent || _a == nsMsgSearchAttrib::HasAttachmentStatus))
%}

[ptr] native nsSearchMenuItem(nsSearchMenuItem);

