#ifndef MANAGER_H
#define MANAGER_H

#include "Company.hpp"

class Manager : Employee {
	/* fix fizetés
	 */
	int pay_m;
	Company * company_m;

public:
	Manager(std::string name, Company * company)
		: Employee(name), pay_m(0), company_m(company) {
	}

	Manager(std::string name, int year_of_birth, int pay, Company * company)
		: Employee(name, year_of_birth), pay_m(pay), company_m(company) {
	}

	// ### ###

	int get_cost() override {
		return pay_m;
	}

	/* "ennek megfelelő levonást (egészen 0-ig)" kitűzés teljesítése
	 */
	int get_pay() {
		int r = (signed long long)(company_m->profit() * 0.01);
		return std::max(get_cost() + r, 0);
	}

	virtual void details() {
		common_details();
		printf(
			"\tBase pay:       %7d\n"
			"\tCalculated pay: %7d\n",
			get_cost(),
			get_pay()
		);
	}

	bool modify(const std::string &modification) override {
		if (Employee::modify(modification)) { return true; }
		
		auto eq_pos = modification.find("=");
		try {
			if (modification.substr(0, eq_pos) == "pay") {
				pay_m = std::stoi(modification.substr(eq_pos+1));
				return true;
			}
		} catch (...) {	// lehetséges `invalid_argument` vagy `out_of_range`
			return false;
		}

		return false;
	}

	std::string serialize() {
		return std::string()
			+ "m;"
			+ Employee::serialize() + ";"
			+ std::to_string(pay_m) + ";"
			+ company_m->name_m
			;
	}
};

#endif