// file      : composite/person.hxx
// author    : Boris Kolpackov <boris@codesynthesis.com>
// copyright : not copyrighted - public domain

#ifndef PERSON_HXX
#define PERSON_HXX

#include <vector>
#include <string>

#include <odb/core.hxx>

#pragma db value
class basic_name
{
public:
  basic_name (const std::string& first, const std::string& last)
      : first_ (first), last_ (last)
  {
  }

  const std::string&
  first () const
  {
    return first_;
  }

  const std::string&
  last () const
  {
    return last_;
  }

private:
  friend class odb::access;

  basic_name () {} // Needed for storing basic_name in containers.

  std::string first_;
  std::string last_;
};

typedef std::vector<basic_name> basic_names;


#pragma db value
class name_extras
{
public:
  // Nickname.
  //
  const std::string&
  nickname () const
  {
    return nickname_;
  }

  void
  nickname (const std::string& nickname)
  {
    nickname_ = nickname;
  }

  // Aliases.
  //
  const basic_names&
  aliases () const
  {
    return aliases_;
  }

  basic_names&
  aliases ()
  {
    return aliases_;
  }

private:
  friend class odb::access;

  std::string nickname_;
  basic_names aliases_;
};


#pragma db value
class name: public basic_name
{
public:
  name (const std::string& first,
        const std::string& last,
        const std::string& title)
      : basic_name (first, last), title_ (title)
  {
  }

  // Title.
  //
  const std::string&
  title () const
  {
    return title_;
  }

  // Extras.
  //
  const name_extras&
  extras () const
  {
    return extras_;
  }

  name_extras&
  extras ()
  {
    return extras_;
  }

private:
  friend class odb::access;

  std::string title_;
  name_extras extras_;
};


#pragma db object
class person
{
public:
  person (const std::string& first,
          const std::string& last,
          const std::string& title)
      : name_ (first, last, title)
  {
  }

  // Name.
  //
  typedef ::name name_type;

  const name_type&
  name () const
  {
    return name_;
  }

  name_type&
  name ()
  {
    return name_;
  }

private:
  friend class odb::access;

  person (): name_ ("", "", "") {}

  #pragma db id auto
  unsigned long id_;

  name_type name_;
};

#endif // PERSON_HXX