/**
*	Класс "CBookItems" представляет собой сущность телефонного справочника
*	Он хранит в себе все номера, имена и фамилии абонентов, занесённых в справочник
*	Может менять и возвращать данные отдельного абонента, занесённого в справочник
*	Может сортировать абонентов по фамилии или по имени
*	Может производить поиск абонентов по фамилии, имени и номеру
*	Может сохранять данные абонентов телефонного справочника в файл
*	Может загружать данные абонентов телефонного справочника из файла
*/

#pragma once
#include <iostream>
#include <string>
#include <vector>
#include <fstream>

using namespace std;


class CBookItems
{
public:
  template<class T>
	class BookItem
	{
		private:
			T _sFirstName;
			T _sLastName;
			T _sPhoneNumber1;
			T _sPhoneNumber2;
		public:
			BookItem()
			{
			}
			virtual ~BookItem()
			{
			}

		//===============================================================================
		/**
		*Переопределяет операторы вывода/вывода
		*/
		friend std::ostream& operator<<(std::ostream& s, const BookItem<string>& item);
		friend std::istream& operator>>(std::istream& s, BookItem<string>& item);

		friend CBookItems;
	};

	vector<BookItem<string> > _aItems;

public:
	
	//===============================================================================
	/**
	*Создаёт элемент телефонного справочника и задаёт его значение
	*/
	void CreateNewItem(string sFirstName, string sLastName, string sPhoneNumber1);
	
	//===============================================================================
	/**
	*Создаёт элемент телефонного справочника и задаёт его значение (2 телефона)
	*/
	void CreateNewItem(string sFirstName, string sLastName, string sPhoneNumber1, string sPhoneNumber2);

	//===============================================================================
	/**
	*Меняет значение заданного элемента телефонного справочника
	*/
	int SetNewValueToItem(string sFirstName, string sLastName, string sPhoneNumber1, int nNumOfItem);

	//===============================================================================
	/**
	*Меняет значение заданного элемента телефонного справочника (2 телефона)
	*/
	int SetNewValueToItem(string sFirstName, string sLastName, string sPhoneNumber1, string sPhoneNumber2, int nNumOfItem);

	//===============================================================================
	/**
	*Возвращает данные элемента телефонного справочника
	*/
	int GetItem(int nNumOfItem, string& sFirstName, string& sLastName, string& sPhoneNumber1);

	//===============================================================================
	/**
	*Возвращает данные элемента телефонного справочника (2 телефона)
	*/
	int GetItem(int nNumOfItem, string& sFirstName, string& sLastName, string& sPhoneNumber1, string& sPhoneNumber2);

	//===============================================================================
	/**
	*Возвращает элемент телефонного справочника
	*/
	const BookItem<string>& GetItem(int nNumOfItem);

	//===============================================================================
	/**
	*Возвращает количество элементов в телефонном справочнике
	*/
	int GetSize();

	//===============================================================================
	/**
	*Сортирует абонентов в справочнике по именам или фамилии
	*/
	int SortItems(int nSortingType);

	//===============================================================================
	/**
	*Ищет абонентов по имени, фамилии или по номеру телефона
	*/
	int FindItem(string sDesiredValue, int nSortingType, vector<int>& nNumOfDesirvedItems);

	//===============================================================================
	/**
	*Сохраняет данные абонентов телефонной книги
	*/
	int SaveItems(string sNameOfFile);

	//===============================================================================
	/**
	*Загружает данные абонентов телефонной книги
	*/
	int LoadItems(string sNameOfFile);
};