#pragma once


class Figure {
public:
	virtual std::string Name() = 0;
	virtual double Perimeter() = 0;
	virtual double Area() = 0;
};

class Rect : public Figure {
public:
	Rect(int w, int h) : width(w), height(h) {}

	std::string Name() override {
		return "RECT";
	}

	double Perimeter() override {
		return ((width + height) * 2);
	}

	double Area() override {
		return (width * height);
	}

private:
	double width, height;
};


class Treangle : public Figure {
public:
	Treangle(int a, int b, int c): A(a), B(b), C(c) {}

	std::string Name() override {
		return "TREANGLE";
	}

	double Perimeter() override {
		return (A + B + C);
	}

	double Area() override {
		double p = (A + B + C) / 2;
		return sqrt(p * (p - A) * (p - B) * (p - C));
	}

private:
	double A, B, C;
};


class Circle : public Figure {
public:
	Circle(int r) : R(r) {}

	std::string Name() override {
		return "CIRCLE";
	}

	double Perimeter() override {
		return 2 * P * R;
	}

	double Area() override {
		return P * R * R;
	}

private:
	double R;
	double P = 3.14;
};


auto CreateFigure(std::istringstream & is) {
	std::string figure_name;
	is >> figure_name;
	is >> std::ws;

	if (figure_name == "RECT") {
		int a, b;
		is >> a;
		is >> std::ws;
		is >> b;

		std::shared_ptr<Figure>figure;
		{
			std::shared_ptr<Rect>rect = std::make_shared<Rect>(a, b);
			figure = rect;
		}

		return figure;
	}

	 else if (figure_name == "TRIANGLE") {
		int a, b, c;
		is >> a;
		is >> std::ws;
		is >> b;
		is >> std::ws;
		is >> c;

		std::shared_ptr<Figure>figure;
		{
			std::shared_ptr<Treangle>treatangle = std::make_shared<Treangle>(a, b, c);
			figure = treatangle;
		}

		return figure;
	}

	else if (figure_name == "CIRCLE") {
		int r;
		is >> r;

		std::shared_ptr<Figure>figure;
		{
			std::shared_ptr<Circle>circle = std::make_shared<Circle>(r);
			figure = circle;
		}

		return figure;
	}
}