#include "CConsoleUI.h"

void CConsoleUI::StartUsingUI(CBookItems& CPhoneBook)
{
	LoadPhoneBook(CPhoneBook);
	bExit = false;
	_aUserCommandList.push_back("help");
	_aUserCommandList.push_back("SHW_PHNBOOK");
	_aUserCommandList.push_back("CNG_ITEM");
	_aUserCommandList.push_back("SRT_ITEMS");
	_aUserCommandList.push_back("FND_ITEM");
	_aUserCommandList.push_back("CRT_ITEM");
	_aUserCommandList.push_back("SAVE_ITEMS");
	_aUserCommandList.push_back("EXIT");
	_aUserCommandList.push_back("LOAD_ITEMS");

}

void CConsoleUI::PrintPhoneBook(CBookItems& CPhoneBook)
{
	if (CPhoneBook.GetSize() >= 1)
	{
		for (int i = 0; i < CPhoneBook.GetSize(); i++)
		  cout << 1 + i << ". " << CPhoneBook.GetItem(i) << endl;
	}
	else
	{
		cout << "Ваша телефонная книга пуста" << endl;
	}
	
}

void CConsoleUI::ChangeSomeItem(CBookItems& CPhoneBook)
{
	int nNumOfElement = 0;
	string sFName;
	string sLName;
	string sNum1;
	string sNum2;

	cout << "Введите номер элемента: ";
	cin >> nNumOfElement;
	cout << "Введите имя, фамилию и номера абонента:" << endl;
	cout << "Имя: ";
	cin >> sFName;
	cout << "Фамилия: ";
	cin >> sLName;
	cout << "Номер1: ";
	cin >> sNum1;
	cout << "Номер2: ";
	cin >> sNum2;
	CPhoneBook.SetNewValueToItem(sFName, sLName, sNum1, sNum2, nNumOfElement);
}

void CConsoleUI::SortItems(CBookItems& CPhoneBook)
{
	int nSortingType = 0;
	cout << "Введите номера типа сортировки:" << endl;
	cout << "1. По Имени" << endl;
	cout << "2. По Фамилии" << endl;
	cout << "3. По Номеру1" << endl;
	cout << "4. По Номеру2" << endl;
	cin >> nSortingType;
	nSortingType--;
	int error = CPhoneBook.SortItems(nSortingType);
	if (error == 1)
	{
		cout << "Ошибка: команда введена неверно!" << endl;
	}
}

void CConsoleUI::FindItem(CBookItems& CPhoneBook)
{
	string sValueNeed = "";
	vector<int> nNumOfDesirvedItems;
	int nSortingType = 0;
	cout << "Введите номера типа поиска:" << endl;
	cout << "1. По Имени" << endl;
	cout << "2. По Фамилии" << endl;
	cout << "3. По Номеру" << endl;
	cin >> nSortingType;
	cout << "Введите имя/фамилию/телефон абонента: ";
	cin >> sValueNeed;

	CPhoneBook.FindItem(sValueNeed, nSortingType, nNumOfDesirvedItems);

	for (int i = 0; i < nNumOfDesirvedItems.size(); i++)
	{
		string sFName = " ";
		string sLName = " ";
		string sNum1 = " ";
		string sNum2 = " ";

		CPhoneBook.GetItem(nNumOfDesirvedItems.at(i), sFName, sLName, sNum1, sNum2);
		cout << 1 + i << ". " << sFName << " " << sLName << ": " << sNum1 << ", " << sNum2 << endl;
	}
}

void CConsoleUI::CreateNewItem(CBookItems& CPhoneBook)
{
	string sFName;
	string sLName;
	string sNum1;
	string sNum2;

	cout << "Введите имя, фамилию и номера абонента:" << endl;
	cout << "Имя: ";
	cin >> sFName;
	cout << "Фамилия: ";
	cin >> sLName;
	cout << "Номер1: ";
	cin >> sNum1;
	cout << "Номер2: ";
	cin >> sNum2;

	CPhoneBook.CreateNewItem(sFName, sLName, sNum1, sNum2);
}

void CConsoleUI::Help()
{
	cout << "Перечисленные ниже команды" << endl << "Помогают взаимодействовать пользователю со справочником: " << endl;
	cout << "EXIT- закрыть программу" << endl;
	cout << "SHW_PHNBOOK- показать справочник" << endl;
	cout << "CNG_ITEM- изменить данные абонента" << endl;
	cout << "SRT_ITEMS- сортировка абонентов" << endl;
	cout << "FND_ITEM- поиск абонентов" << endl;
	cout << "CRT_ITEM- создание нового аонента" << endl;
	cout << "SAVE_ITEMS- сохранение данных пользователей" << endl;
	cout << "LOAD_ITEMS- загрузка данных пользователей" << endl;
}

void CConsoleUI::MakeSomeAcion(CBookItems& CPhoneBook)
{
	cout << "Введите комманду для взаимодействия с телефонным справочником" << endl << "(Введите 'help' для отображения команд): ";
	cin >> _sUserCommand;
	system("cls");
	for (int i = 0; i < _aUserCommandList.size(); i++)
	{
		if (_sUserCommand == _aUserCommandList.at(i))
		{
			switch (i)
			{
			case 0:
				Help();
				break;
			case 1:
				PrintPhoneBook(CPhoneBook);
				break;
			case 2:
				ChangeSomeItem(CPhoneBook);
				PrintPhoneBook(CPhoneBook);
				break;
			case 3:
				SortItems(CPhoneBook);
				PrintPhoneBook(CPhoneBook);
				break;
			case 4:
				FindItem(CPhoneBook);
				break;
			case 5:
				CreateNewItem(CPhoneBook);
				PrintPhoneBook(CPhoneBook);
				break;
			case 6:
				SavePhoneBook(CPhoneBook);
				PrintPhoneBook(CPhoneBook);
				break;
			case 7:
				CloseProgramm();
				break;
			case 8:
				LoadPhoneBook(CPhoneBook);
				PrintPhoneBook(CPhoneBook);
				break;
			default:
				cout << "Неверно введена команда" << endl;
				break;
			}
		}
	}
}

void CConsoleUI::SavePhoneBook(CBookItems& CPhoneBook)
{
	if (CPhoneBook.SaveItems("myFile.txt") == 1)
	{
		cout << "Ошибка открытия файла" << endl;
	}
	else
	{
		cout << "Файл успешно открыт" << endl;
	}
}

void CConsoleUI::LoadPhoneBook(CBookItems& CPhoneBook)
{
	if (CPhoneBook.LoadItems("myFile.txt") == 1)
	{
		cout << "Ошибка доступа к файлу" << endl;
	}
	else
	{
		cout << "Данные успешно загружены" << endl;
	}
}

void CConsoleUI::CloseProgramm()
{
	bExit = true;
}

void CConsoleUI::SetConsoleUI(CBookItems& CPhoneBook)
{
	StartUsingUI(CPhoneBook);
	setlocale(LC_ALL, "Rus");
	while (!bExit)
	{
		MakeSomeAcion(CPhoneBook);
	}
	system("cls");
}
