#include <iostream>
#include <string>
#include "Windows.h" // Behövs bland annat för funktionen Sleep.
using namespace std;

#include "Person.h"
#include "Frukt.h"
#include "funktioner.h" // Innehåller deklaration av välja_handling.

Person** Person::alla_personer = nullptr; // Definition av klassmedlem.
unsigned int Person::maximalt_antal = 0; // Definition av klassmedlem.
unsigned int Person::antal_personer = 0; // Definition av klassmedlem.

// Förvald konstruktor:
Person::Person() : barn(nullptr), antal_frukter(0), frukter(nullptr)
{
	cout << endl << "Inmatning av ny person:" << endl;
	cout << "-----------------------" << endl;
	cout << "Vad är personens förnamn? ";
	cin >> förnamn;
	cout << "Vad är " << förnamn << "\'s ålder? ";
	cin >> ålder;
	cout << "-----------------------" << endl;
	antal_personer++; // Antal personer ökas.
	int i = 0;
	while (alla_personer[i]) // Hitta första lediga plats i alla_personer.
		i++;
	alla_personer[i] = this; // Det nya Personobjektet läggs in i fältet.
}

// Konstruktor:
Person::Person(Person* förälder1, Person* förälder2) : barn(nullptr)
{
	förälder1->barn = this; // Första föräldern.
	förälder2->barn = this; // Andra föräldern
	cout << endl << förälder1->förnamn << " och " << förälder2->förnamn;
	cout << " får ett barn." << endl;
	cout << endl << "Vad ska barnet heta? ";
	cin >> förnamn; // Läser från cin till stringobjektet förnamn.
	ålder = 0; // Barnets ålder sätts till noll.
	cout << endl << förnamn << " behöver frukt. ";
	Sleep(1000); // Vänta en sekund.
	Person* den_som_ska_ge_frukt = nullptr; // Temporär pekarvariabel.
	if (förälder1->antal_frukter > förälder2->antal_frukter)
		den_som_ska_ge_frukt = förälder1; // förälder1 har mest frukt.
	else
		den_som_ska_ge_frukt = förälder2; // förälder2 har mest frukt.
	cout << den_som_ska_ge_frukt->förnamn << " ger all sin frukt till ";
	cout << förnamn << "." << endl;
	Sleep(1000); // Vänta en sekund.

	antal_frukter = den_som_ska_ge_frukt->antal_frukter;
	frukter = den_som_ska_ge_frukt->frukter;
	// All den_som_ska_ge_frukt's frukt tillhör nu barnet.

	den_som_ska_ge_frukt->antal_frukter = 0;
	den_som_ska_ge_frukt->frukter = nullptr;
	// Föräldern (den_som_ska_ge_frukt) har nu ingen frukt.

	antal_personer++; // Antal personer ökas.
	int i = 0;
	while (alla_personer[i]) // Hitta första lediga plats i alla_personer.
		i++;
	alla_personer[i] = this; // Det nya Personobjektet läggs in i fältet.
}

Person::~Person() // Destruktor.
{
	if (ålder >= 100)
	{
		cout << endl << förnamn << " är " << ålder << " år gammal";
		cout << " och dör av ålderdom." << endl;
	}
	else
	{
		cout << endl << förnamn << " tas bort." << endl;
		Sleep(1000); // Vänta en sekund.
	}
	for (unsigned int i = 0; i < maximalt_antal + 1; i++)
		if (alla_personer[i] == this)
			alla_personer[i] = nullptr; // Inte peka på något som inte finns.
	for (int i = 0; i < antal_frukter; i++)
	{
		delete frukter[i]; // All frukt tas bort, ett objekt i taget.
		Sleep(500); // Vänta en halv sekund.
	}
	delete[] frukter; // Fältet med pekare tas bort, inga frukter kvar.
	antal_personer--; // Antal personer minskas.
}

void Person::Plocka_frukter(unsigned short antal) // Synlig medlemsfunktion.
{
	if (antal_frukter > 0)
	{
		cout << endl << förnamn << " är girig och försöker plocka frukt";
		cout << endl << förnamn << " fast det finns frukt kvar." << endl;
		Sleep(1000); // Vänta en sekund.
		cout << "Det går inte. " << förnamn << " har " << antal_frukter;
		cout << " frukt som måste ätas först." << endl;
		return;
	}
	frukter = new Frukt * [antal]; // Ett fält av "pekare till Frukt".
	for (int i = 0; i < antal; i++)
	{
		frukter[i] = new Frukt; // Fruktobjekten skapas en i taget.
		antal_frukter++;
	}
}

void Person::Äta_frukt() // Synlig medlemsfunktion.
{
	if (antal_frukter < 1)
	{
		cout << förnamn << " har inga frukter kvar. Inga frukter äts." << endl;
		return; // Funktion avslutas om det inte finns några frukter.
	}
	delete frukter[antal_frukter - 1]; // Ett Fruktobjekt ta bort.
	frukter[antal_frukter - 1] = nullptr; // Pekarvärdet sätts till 0.
	antal_frukter--; // Antal frukter som personen har minskas.
	cout << förnamn << " har " << antal_frukter << " kvar." << endl;
}

void Person::Besöka_person() // Synlig medlemsfunktion.
{
	string n; // Temporärt stringobjekt.
	cout << "Vem ska " << förnamn << " besöka? ";
	cin >> n;
	for (unsigned int i = 0; i < maximalt_antal; i++)
	{
		if (alla_personer[i] == nullptr)
			continue; // Personer som tagits bort kan ej besökas.
		if (alla_personer[i]->förnamn == n)
		{
			alla_personer[i]->Få_besök(this);
			return; // Efter avslutat besök avslutas funktionen.
		}
	}
	cout << "En person med förnamnet " << n << " finns inte. " << endl;
	Sleep(1000); // Vänta en sekund.
	cout << "Inget besök sker." << endl;
}

void Person::Få_besök(Person* besökare) // Privat medlemsfunktion.
{
	if (besökare == this)
	{
		cout << förnamn << " kan inte besöka sig själv!" << endl;
		return; // En person kan inte besöka sig själv.
	}
	if (ålder < 2) // Den som får besök är en småtting.
	{
		cout << förnamn << " (" << ålder << " år) säger: Da da daa ba!" << endl;
		return;
	}
	if (ålder < 13) // Den som får besök är mellan 3 och 12.
	{
		cout << förnamn << " säger: Hej på dig!" << endl;
		return;
	}
	if (barn == besökare) // Är det en person som besöker sin förälder?
	{
		if (besökare->ålder < 16) // Är besökaren ett barn?
		{
			cout << endl << förnamn << " säger: Hej, mitt barn. ";
			if (antal_frukter > 0)
			{
				cout << "Här får du en frukt. Hoppas ";
				Sleep(1000); // Vänta en sekund.
				cout << frukter[antal_frukter - 1]->Namn() << " blir bra." << endl;
				delete frukter[antal_frukter - 1]; // Ett fruktobjekt tas bort.
				frukter[antal_frukter - 1] = nullptr; // Pekaren nollställs.
				antal_frukter--; // Antal frukter minskas för den som får besök.
				if (antal_frukter == 0)
				{
					delete[] frukter; // Fältet tas bort, inga frukter finns kvar.
					frukter = nullptr; // Pekaren frukter nollställs.
				}
				return;
			}
			cout << "Jag har tyvärr ingen frukt." << endl;
		}
		return;
	}
	if (this == besökare->barn) // Är en person som besöker sitt barn?
	{
		cout << endl << förnamn << " säger: Hej, min favoritförälder.";
		return;
	}
	cout << endl << förnamn << " säger: Hej, " << besökare->förnamn << ". ";
	if (besökare->antal_frukter > antal_frukter)
	{
		cout << "Du har mer frukt än jag har. Det gillar jag inte. " << endl;
		return;
	}
	cout << "Jag gillar dig. ";
	Sleep(1000); // Vänta en sekund.
	if (besökare->barn) // Har besökaren barn?
	{
		cout << "Hur är det med " << besökare->barn->förnamn << "?" << endl;
		return;
	}
	if (besökare->ålder > 18)
		cout << "Du är snäll och har inga barn. ";
	else
		cout << "Du kommer att bli snäll när du blir vuxen. ";
	if (barn != nullptr) // Har den som besöks barn?
	{
		cout << "Jag är så glad för min " << barn->förnamn << ". ";
		if (barn->ålder > 1)
			cout << barn->ålder << " år redan.";
		cout << endl;
		return;
	}
	if (besökare->antal_frukter < 3)
	{
		cout << endl << "Men tyvärr " << besökare->förnamn;
		cout << ", du har för lite frukt för mig." << endl;
		return;
	}
	if (ålder > 18 && besökare->ålder > 18) // Är båda över 18?
	{
		if (ålder - besökare->ålder > 20)
		{
			cout << "Kul att prata dig, hej då!" << endl;
			return;
		}
		if (besökare->ålder - ålder > 20)
		{
			cout << "Trevligt att du kom på besök, hej då!" << endl;
			return;
		}
		Sleep(1000); // Vänta en sekund.
		cout << endl << endl << "Efter några romantiska middagar blir ";
		cout << förnamn << " och " << besökare->förnamn << " ett par.";
		cout << endl << endl;
		Sleep(1000); // Vänta en sekund.
		cout << "Ett år passerar i deras liv." << endl;
		Sleep(1000); // Vänta en sekund.
		Fylla_år();
		Sleep(1000); // Vänta en sekund.
		besökare->Fylla_år();
		Sleep(1000); // Vänta en sekund.
		new Person(this, besökare); // De får ett barn.
	}
}

void Person::Fylla_år() // Synlig medlemsfunktion.
{
	ålder++;
	cout << endl << "Hurra! " << förnamn << " fyller " << ålder << " år!" << endl;
}