/***************************************************************************
                          mymoneypayee.h
                             -------------------
    copyright            : (C) 2000 by Michael Edwardes
                               2005 by Thomas Baumgart
    email                : mte@users.sourceforge.net
                           ipwizard@users.sourceforge.net
 ***************************************************************************/

/***************************************************************************
 *                                                                         *
 *   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.                                   *
 *                                                                         *
 ***************************************************************************/

#ifndef MYMONEYPAYEE_H
#define MYMONEYPAYEE_H

// ----------------------------------------------------------------------------
// TQt Includes

#include <tqstring.h>
class TQStringList;

// ----------------------------------------------------------------------------
// Project Includes

#include <kmymoney/export.h>
#include <kmymoney/mymoneyobject.h>

/**
  * This class represents a payee or receiver within the MyMoney engine.
  * Since it is not payee-specific, it is also used as a generic address
  * book entry.
  *
  * @author Thomas Baumgart
  */
class KMYMONEY_EXPORT MyMoneyPayee : public MyMoneyObject
{
private:
  // Simple fields
  TQString m_name;
  TQString m_address;
  TQString m_city;
  TQString m_state;
  TQString m_postcode;
  TQString m_telephone;
  TQString m_email;
  TQString m_notes;

  // Transaction matching fields
  bool m_matchingEnabled;      //< Whether this payee should be matched at all
  bool m_usingMatchKey;        //< If so, whether a m_matchKey list is used (true), or just m_name is used (false)
  bool m_matchKeyIgnoreCase;   //< Whether to ignore the case of the match key or name

  /**
   * Semicolon separated list of matching keys used when trying to find a suitable
   * payee for imported transactions.
   */
  TQString m_matchKey;

  // Category (account) matching fields
  TQString m_defaultAccountId;

  /**
    * This member keeps a reference to an external database
    * (e.g. kaddressbook). It is the responsability of the
    * application to format the reference string
    * (e.g. encoding the name of the external database into the
    * reference string).
    * If no external database is available it should be kept
    * empty by the application.
    */
  TQString m_reference;

public:
  typedef enum {
    matchDisabled = 0,
    matchName,
    matchKey
  } payeeMatchType;

  MyMoneyPayee();
  MyMoneyPayee(const TQString& id, const MyMoneyPayee& payee);
  MyMoneyPayee(const TQString& name,
          const TQString& address=TQString(),
          const TQString& city=TQString(),
          const TQString& state=TQString(),
          const TQString& postcode=TQString(),
          const TQString& telephone=TQString(),
          const TQString& email=TQString());
  /**
    * This is the constructor for a payee that is described by a
    * TQDomElement (e.g. from a file).
    *
    * @param el const reference to the TQDomElement from which to
    *           create the object
    */
  MyMoneyPayee(const TQDomElement& el);

  ~MyMoneyPayee();

  // Simple get operations
  TQString name(void) const            { return m_name; }
  TQString address(void) const         { return m_address; }
  TQString city(void) const            { return m_city; }
  TQString state(void) const           { return m_state; }
  TQString postcode(void) const        { return m_postcode; }
  TQString telephone(void) const       { return m_telephone; }
  TQString email(void) const           { return m_email; }
  TQString notes(void) const           { return m_notes; }

  const TQString id(void) const        { return m_id; };
  const TQString reference(void) const { return m_reference; };

  // Simple set operations
  void setName(const TQString& val)      { m_name = val; }
  void setAddress(const TQString& val)   { m_address = val; }
  void setCity(const TQString& val)      { m_city = val; }
  void setState(const TQString& val)     { m_state = val; }
  void setPostcode(const TQString& val)  { m_postcode = val; }
  void setTelephone(const TQString& val) { m_telephone = val; }
  void setEmail(const TQString& val)     { m_email = val; }
  void setNotes(const TQString& val)     { m_notes = val; }
  void setReference(const TQString& ref) { m_reference = ref; }

  /**
   * Get all match data in one call
   *
   * @param ignorecase Bool which will be replaced to indicate whether the match is
   * case-sensitive (false) or case-insensitive (true)
   * @param keys List of strings which will be replaced by the match key to use for this payee
   *
   * @return the matching type (see payeeMatchType for details)
   */
  payeeMatchType matchData(bool& ignorecase, TQStringList& keys) const;

  /**
   * Set all match data in one call
   *
   * @param type matching type (see payeeMatchType for details)
   * @param ignorecase Whether case should be ignored for the key/name match
   * @param keys A list of keys themselves, if applicable
   */
  void setMatchData(payeeMatchType type, bool ignorecase, const TQStringList& keys);

  /**
   * Get all match data in one call (overloaded version for database module)
   *
   * @param ignorecase Bool which will be replaced to indicate whether the match is
   * case-sensitive (false) or case-insensitive (true)
   * @param keyString A list of keys in single-string format, if applicable
   *
   * @return the matching type (see payeeMatchType for details)
   */
  payeeMatchType matchData(bool& ignorecase, TQString& keyString) const;

  /**
   * Set all match data in one call (overloaded version for database module)
   *
   * @param type matching type (see payeeMatchType for details)
   * @param ignorecase Whether case should be ignored for the key/name match
   * @param keys A list of keys in single-string format, if applicable
   */
  void setMatchData(payeeMatchType type, bool ignorecase, const TQString& keys);


  bool defaultAccountEnabled() const { return !m_defaultAccountId.isEmpty(); }
  const TQString& defaultAccountId() const { return m_defaultAccountId; }
  void setDefaultAccountId(const TQString& id = TQString()) {
    m_defaultAccountId = id;
  }

  // Copy constructors
  MyMoneyPayee(const MyMoneyPayee&);

  // Equality operator
  bool operator == (const MyMoneyPayee &) const;

  void writeXML(TQDomDocument& document, TQDomElement& parent) const;

  /**
    * This method checks if a reference to the given object exists. It returns,
    * a @p true if the object is referencing the one requested by the
    * parameter @p id. If it does not, this method returns @p false.
    *
    * @param id id of the object to be checked for references
    * @retval true This object references object with id @p id.
    * @retval false This object does not reference the object with id @p id.
    */
  virtual bool hasReferenceTo(const TQString& id) const;

  static MyMoneyPayee null;
};

inline bool operator==(const MyMoneyPayee& lhs, const TQString& rhs) { return lhs.id() == rhs; }

#endif
