#include <iostream>
#include <cmath>
#include <cassert>
#include "flugkurve02.h"
using namespace std;

void function_checks() {
	// mulVektor
	Vektor test_vec = {10, 11};
	Vektor result = mulVektor(test_vec, -3);
	assert(fabs(result.x + 30) < 0.1 && "Result must be -30");
	assert(fabs(result.y + 33) < 0.1 && "Result must be -33");
	cout << "mulVektor erfolgreich" << endl;
	
	// addVektor
	Vektor test_vec_2 = {-10, 31};
	result = addVektor(test_vec, test_vec_2);
	assert(fabs(result.x + 0) < 0.1 && "Result must be 0");
	assert(fabs(result.y - 42) < 0.1 && "Result must be 42");
	cout << "addVektor erfolgreich" << endl;
	
	// bewegeKoerper
	Koerper koerper;
	koerper.masse = 10;
	koerper.position = { 0, 0 };
	koerper.geschwindigkeit = { 10, 10 };
	Vektor bewegung = {1, -1};
	const float dt = 7.0;
	koerper = bewegeKoerper(koerper, bewegung, dt);
	assert(fabs(koerper.geschwindigkeit.x - 10.7) < 0.1 && "Result must be 10.7");
	assert(fabs(koerper.geschwindigkeit.y - 9.3) < 0.1 && "Result must be 9.3");
	assert(fabs(koerper.position.x - 74.9) < 0.1 && "Result must be 74.9");
    cout << koerper.position.y << endl;
	assert(fabs(koerper.position.y - 65.1) < 0.1 && "Result must be 65.1");
	cout << "bewegeKoerper erfolgreich" << endl;
}

int main()
{
	cout << "Funktionsüberprüfung" << endl;

	// Function checks
	function_checks();
	
	// Check whole program
	cout << "Simulation" << endl;
	Koerper koerper;
	koerper.masse = 10;
	koerper.position = { 0, 0 };
	koerper.geschwindigkeit = { 10, 10 };
	// Parametrierung der auf den Körper wirkende Kräfte:
	const Vektor BESCHLEUNIGUNG_GRAVITATION = {0, -9.81}; // [m/s^2]
	const float REIBUNGSKOEFFIZIENT = -5; // [kg/s]
	// Sorgt dafür, dass 2 Nachkommastellen angezeigt werden:
	cout << fixed;
	cout.precision(2);
	// Simulation:
	const float dt = 0.1;
	for(;;)
	{
		cout << "Position des Körpers: ";
		ausgabeKoerper(koerper);
		cout << endl;
		// Bestimmung der Kraft
		Vektor reibungskraft = mulVektor(koerper.geschwindigkeit,
		REIBUNGSKOEFFIZIENT);
		Vektor anziehungskraft = mulVektor(BESCHLEUNIGUNG_GRAVITATION,
		koerper.masse);
		Vektor gesamtkraft = addVektor(reibungskraft,anziehungskraft);
		// Ermittlung der neuen Position und neuen Geschwindigkeit
		koerper = bewegeKoerper(koerper,gesamtkraft,dt);
		if(koerper.position.y<=0)
		{
			break;
		}
	}
	
}
