#include "stdafx.h"
#include "station.h"

void station::add(material* pMaterial)
{
	ofstream file;
	file.open("data.txt", ios::app); //открываем файл на дополнение
	if (file.is_open()) //если файл открылся
	{
		file << pMaterial->serialize(); //добавляем ГСМ в файл
		file.close(); //закрываем файл
	}
}

void station::add()
{
	cout << "Add new material.\n";
	cout << "Input 1 to add a fuel and 0 to add a lubricant: ";
	bool isFuel;
	cin >> isFuel;
	cout << "Input a name: ";
	string name;
	name = readLine();
	cout << "Input the price of one liter: ";
	unsigned price;
	cin >> price;
	material* pMaterial = new material(name, isFuel, price);
	add(pMaterial);
	delete pMaterial;
}

void station::show()
{
	ifstream file;
	file.open("data.txt");
	if (file.is_open())
	{
		while (!file.eof())
		{
			material* pMaterial = material::next(&file);
			if (pMaterial)
			{
				pMaterial->print();
				delete pMaterial;
			}			
		}
		file.close();
	}
	system("pause");
}

void station::change(unsigned num, string name, unsigned price)
{
	ifstream file;
	file.open("data.txt"); //Открывает файл с записями на чтение
	ofstream temp;
	temp.open("temp.txt", ios::app);//открывает вспомогательный файл на дополнение
	if (file.is_open() && temp.is_open())//если файлы открылись
	{
		material* pMaterial = NULL;
		do
		{
			pMaterial = material::next(&file); //чяитываем очередную запись
			if (pMaterial) //если запись считана
			{//если дошли до записи с нужным номером, изменяем ее свойства
				if (pMaterial->get_number() == num) pMaterial->change(name, price);
				temp << pMaterial->serialize(); //записываем считанную запись в спомагательный файл
			}
		} 
		while (pMaterial);
		file.close(); //закрываем файлы
		temp.close();
		MoveFileEx ("temp.txt","data.txt",MOVEFILE_REPLACE_EXISTING); //перемещаем вспомагательный файл на место основного
	}
	cout << "Changes were saved.\n";
	system("pause");
}

void station::change(unsigned num)
{
	cout << "Change a POL №" << num << endl;
	cout << "Input new name: ";
	string name = readLine();
	cout << "Input new price: ";
	unsigned price;
	cin >> price;
	change(num, name, price);
}

void station::del(unsigned num)
{
	ifstream file;
	file.open("data.txt"); //Открывает файл с записями на чтение
	ofstream temp;
	temp.open("temp.txt", ios::app);//открывает вспомогательный файл на дополнение
	if (file.is_open() && temp.is_open())//если файлы открылись
	{
		material* pMaterial = NULL;
		do
		{
			pMaterial = material::next(&file); //чяитываем очередную запись
			if (pMaterial) //если запись считана
			{//если номер записи не равен данному, записываем считанную запись в спомагательный файл
				if (pMaterial->get_number() != num) temp << pMaterial->serialize(); 
			}
		} while (pMaterial);
		file.close(); //закрываем файлы
		temp.close();
		MoveFileEx ("temp.txt","data.txt",MOVEFILE_REPLACE_EXISTING); //перемещаем вспомагательный файл на место основного
	}
	cout << "The record was deleted.\n";
	system("pause");
}

void station::substr_volume(unsigned num, unsigned dV)
{
	ifstream file;
	file.open("data.txt"); //Открывает файл с записями на чтение
	ofstream temp;
	temp.open("temp.txt", ios::app);//открывает вспомогательный файл на дополнение
	if (file.is_open() && temp.is_open())//если файлы открылись
	{
		material* pMaterial = NULL;
		do
		{
			pMaterial = material::next(&file); //чяитываем очередную запись
			if (pMaterial) //если запись считана
			{//если дошли до записи с нужным номером, изменяем ее свойства
				if (pMaterial->get_number() == num) 
					if (!pMaterial->substract(dV))
					{
						cout << "There is not enough of this fuel In the stock.\n";
						file.close(); //закрываем файлы
						temp.close();
						FILE* temp = fopen("temp.txt", "w");
						fclose(temp);
						system("pause");
						return;
					}
				temp << pMaterial->serialize(); //записываем считанную запись в спомагательный файл
			}
		} while (pMaterial);
		file.close(); //закрываем файлы
		temp.close();
		MoveFileEx ("temp.txt","data.txt",MOVEFILE_REPLACE_EXISTING);//перемещаем вспомагательный файл на место основного
	}
	cout << "Volume was substracted.\n";
	system("pause");
}

void station::substr_volume(unsigned num)
{
	cout << "Substract the volume of POL №" << num << endl;
	cout << "Input substracting volume: ";
	unsigned dV;
	cin >> dV;
	substr_volume(num, dV);
}

void station::add_volume(unsigned num, unsigned dV)
{
	ifstream file;
	file.open("data.txt"); //Открывает файл с записями на чтение
	ofstream temp;
	temp.open("temp.txt", ios::app);//открывает вспомогательный файл на дополнение
	if (file.is_open() && temp.is_open())//если файлы открылись
	{
		material* pMaterial = NULL;
		do
		{
			pMaterial = material::next(&file); //чяитываем очередную запись
			if (pMaterial) //если запись считана
			{//если дошли до записи с нужным номером, изменяем ее свойства
				if (pMaterial->get_number() == num) pMaterial->add(dV);
				temp << pMaterial->serialize(); //записываем считанную запись в спомагательный файл
			}
		} while (pMaterial);
		file.close(); //закрываем файлы
		temp.close();
		MoveFileEx ("temp.txt","data.txt",MOVEFILE_REPLACE_EXISTING); //перемещаем вспомагательный файл на место основного
	}
	cout << "Volume was added.\n";
	system("pause");
}

void station::add_volume(unsigned num)
{
	cout << "Adding volume to POL №" << num << endl;
	cout << "Input adding volume: ";
	unsigned dV;
	cin >> dV;
	add_volume(num, dV);
}


void station::select(unsigned variant)
{
	cout << "Input the number of POL: ";
	unsigned number;
	cin >> number;
	switch (variant)
	{
	case 1: change(number); break;
	case 2: del(number); break;
	case 3: add_volume(number); break;
	case 4: substr_volume(number); break;
	}	
}