/*
 *   This file is part of ScalixAdmin.
 *
 *   Copyright (C) 2007 Trolltech ASA. All rights reserved.
 *
 *   This program is free software; you can redistribute it and/or modify
 *   it under the terms of the GNU General Public License as published by
 *   the Free Software Foundation; either version 2 of the License, or
 *   (at your option) any later version.
 *
 *   This program is distributed in the hope that it will be useful,
 *   but WITHOUT ANY WARRANTY; without even the implied warranty of
 *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *   GNU General Public License for more details.
 *
 *   You should have received a copy of the GNU General Public License
 *   along with this program; if not, write to the Free Software
 *   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
 */

#include <tdeio/job.h>

#ifndef JOBS_H
#define JOBS_H

namespace Scalix {

  enum DelegateTypes
  {
    SendOnBehalfOf = 1,
    SeePrivate = 2,
    GetMeetings = 4,
    InsteadOfMe = 8
  };

  class SetPasswordJob;
  class SetDelegateJob;
  class DeleteDelegateJob;
  class GetDelegatesJob;
  class AddOtherUserJob;
  class DeleteOtherUserJob;
  class GetOtherUsersJob;
  class SetOutOfOfficeJob;
  class GetOutOfOfficeJob;

  class Delegate
  {
    public:
      typedef TQValueList<Delegate> List;

      Delegate();
      Delegate( const TQString &email, int rights );

      bool isValid() const;

      TQString email() const;
      int rights() const;

      static TQString rightsAsString( int rights );

    private:
      TQString mEmail;
      int mRights;
  };

  /**
   * Sets/Changes the password of the user encoded in @p url.
   */
  SetPasswordJob* setPassword( TDEIO::Slave* slave, const KURL& url, const TQString& oldPassword, const TQString& newPassword );

  /**
   * Adds a delegate represented by @p email with the given @p params for the user encoded in @p url.
   */
  SetDelegateJob* setDelegate( TDEIO::Slave* slave, const KURL& url, const TQString& email, int params );

  /**
   * Deletes the delegate represented by @p email for the user encoded in @p url.
   */
  DeleteDelegateJob* deleteDelegate( TDEIO::Slave* slave, const KURL& url, const TQString& email );

  /**
   * Retrieves the delegates for the user encoded in @p url.
   */
  GetDelegatesJob* getDelegates( TDEIO::Slave* slave, const KURL& url );

  /**
   * Adds the mailbox of another user represented by @p email to the users 'Other Users' namespace.
   */
  AddOtherUserJob* addOtherUser( TDEIO::Slave* slave, const KURL& url, const TQString& email );

  /**
   * Deletes the mailbox of another user represented by @p email from the users 'Other Users' namespace.
   */
  DeleteOtherUserJob* deleteOtherUser( TDEIO::Slave* slave, const KURL& url, const TQString& email );

  /**
   * Retrieves the list of all other users.
   */
  GetOtherUsersJob* getOtherUsers( TDEIO::Slave* slave, const KURL& url );

  /**
   * Sets the out-of-office data.
   *
   * @param enabled Whether the out-of-office functionality is enabled.
   * @param msg The out-of-office message.
   */
  SetOutOfOfficeJob* setOutOfOffice( TDEIO::Slave* slave, const KURL& url, bool enabled, const TQString& msg );

  /**
   * Retrieves the out-of-office data.
   */
  GetOutOfOfficeJob* getOutOfOffice( TDEIO::Slave* slave, const KURL& url );


  class SetPasswordJob : public TDEIO::SimpleJob
  {
    public:
      SetPasswordJob( const KURL& url, const TQByteArray &packedArgs, bool showProgressInfo );
  };

  class SetDelegateJob : public TDEIO::SimpleJob
  {
    public:
      SetDelegateJob( const KURL& url, const TQByteArray &packedArgs, bool showProgressInfo );
  };

  class DeleteDelegateJob : public TDEIO::SimpleJob
  {
    public:
      DeleteDelegateJob( const KURL& url, const TQByteArray &packedArgs, bool showProgressInfo );
  };

  class GetDelegatesJob : public TDEIO::SimpleJob
  {
    Q_OBJECT
  

    public:
      GetDelegatesJob( const KURL& url, const TQByteArray &packedArgs, bool showProgressInfo );

      Delegate::List delegates() const;

    private slots:
      void slotInfoMessage( TDEIO::Job*, const TQString& );

    private:
      Delegate::List mDelegates;
  };

  class AddOtherUserJob : public TDEIO::SimpleJob
  {
    public:
      AddOtherUserJob( const KURL& url, const TQByteArray &packedArgs, bool showProgressInfo );
  };

  class DeleteOtherUserJob : public TDEIO::SimpleJob
  {
    public:
      DeleteOtherUserJob( const KURL& url, const TQByteArray &packedArgs, bool showProgressInfo );
  };

  class GetOtherUsersJob : public TDEIO::SimpleJob
  {
    Q_OBJECT
  

    public:
      GetOtherUsersJob( const KURL& url, const TQByteArray &packedArgs, bool showProgressInfo );

      TQStringList otherUsers() const;

    private slots:
      void slotInfoMessage( TDEIO::Job*, const TQString& );

    private:
      TQStringList mOtherUsers;
  };

  class SetOutOfOfficeJob : public TDEIO::SimpleJob
  {
    public:
      SetOutOfOfficeJob( const KURL& url, const TQByteArray &packedArgs, bool showProgressInfo );
  };

  class GetOutOfOfficeJob : public TDEIO::SimpleJob
  {
    Q_OBJECT
  

    public:
      GetOutOfOfficeJob( const KURL& url, const TQByteArray &packedArgs, bool showProgressInfo );

      bool enabled() const;
      TQString message() const;

    private slots:
      void slotInfoMessage( TDEIO::Job*, const TQString& );

    private:
      bool mEnabled;
      TQString mMessage;
  };
}

#endif
