#ifndef __GOLEM_H
#define __GOLEM_H

#ifndef __DATE_H
#include <date.h>
#endif

#ifndef __STRINGS_H
#include <strings.h>
#endif

bool goto_url(const char* url);
bool edit_url(const char* url);
bool print_url(const char* url);

class TMAPI_session;

class TMail_message : public TString_array
{                  
  TString_array _recipients, _copy_recipients, _attachments;
  TString _subject;
  TString _sender;
  TString _id;
  TDate _date;
  long _hms;
  bool _query_receipt;
  
protected:
  bool add_recipient_ex(const char* recipient, int type);

public: // Semiprotected: You don't have access to TMAPI_session
  bool send(TMAPI_session& lhSession, bool hide_ui = false);
  bool remove(TMAPI_session& lhSession);
  
public:                                                       
  bool add_recipient(const char* address) { return add_recipient_ex(address, 0); }
  void set_subject(const char* subject) { _subject = subject; _subject.trim(); }
  bool add_copy_recipient(const char* address) { return add_recipient_ex(address, 1); }
  bool attach(const char* filename) { return add_recipient_ex(filename, 2); }
  void set_sender(const char* address) { _sender = address; _sender.trim(); }
  void set_id(const char* id) { _id = id; }
  void query_receipt(bool qr) { _query_receipt = qr; }
  int add_line(const char * s);
  
  TMail_message& operator = (const char* msg) { destroy(); add(msg); return *this; }
  TMail_message& operator = (const TString& msg) { destroy(); add(msg); return *this; }
  
  bool send(bool hide_ui = false);
  bool remove();

  const TString& sender() const { return _sender; }
  const TString& subject() const { return _subject; }
  const TString& id() const { return _id; }
  bool receipt_requested() const { return _query_receipt; }

  void set_date_time(const char* date_time);
  void set_date_time(const TDate& date, long hhmmss = 0);
  const TDate& date() const { return _date; }
  long time() const { return _hms; }

  int recipients() const { return _recipients.items(); }
  const TString& recipient(int n = 0) const;
  
  TMail_message(const char* recipient = NULL, const char* subject = NULL, 
                const char* text = NULL, const char* sender = NULL);
  virtual ~TMail_message() { }
};

class TMail_messages : public TArray
{
public:
  int get(const char* sender = NULL, const char* subject = NULL, 
          const char* body = NULL, bool attachments = false, bool mark_as_read = false);

  bool send(bool hide_ui = true);
  bool remove();

  TMail_message& msg(int i) 
  { return (TMail_message&)(*this)[i]; }
  
  const TMail_message& msg(int i) const 
  { return (const TMail_message&)(*this)[i]; }
  
  TMail_messages();
  virtual ~TMail_messages() { }
};

#endif