using System;

public class Invoice
{
	private string vendor;
	private double amount;

	public string Vendor
	{
		get
		{
			return vendor;
		}
		set
		{
			vendor = value;
		}
	}

	public double Amount
	{
		get
		{
			return amount;
		}
		set
		{
			amount = value;
		}
	}

	// Konstruktor
	public Invoice(string vendor, double amount)
	{
		this.vendor = vendor;
		this.amount = amount;
	}

	// Przeciążony operator + przyjmuje dwie faktury (obiekty Invoice).
	// Jeśli dostawcy (vendor) są tacy sami, wartości faktur (amount) należy dodać.
	// Jeśli nie, operacje nie powiedzie się, a operator zwraca pustą fakturę.

	public static Invoice operator +(Invoice lhs, Invoice rhs)
	{
		if (lhs.vendor == rhs.vendor)
		{
			return new Invoice(lhs.vendor, lhs.amount + rhs.amount);
		}
		else
		{
			Console.WriteLine("Różni dostawcy. Operacja nieudana.");
			return new Invoice("", 0);
		}
	}

	public void PrintInvoice()
	{
		Console.WriteLine("Faktura od {0} na kwotę {1} złotych.", this.vendor,
						  this.amount);
	}
}

public class Tester
{
	public void Run()
	{
		Invoice firstInvoice = new Invoice("FirmaRodzinna", 345);
		Invoice secondInvoice = new Invoice("FirmaGigant", 56389.53);
		Invoice thirdInvoice = new Invoice("FirmaGigant", 399.65);

		Console.WriteLine("Dodawanie pierwszej i drugiej faktury.");
		Invoice addedInvoice = firstInvoice + secondInvoice;
		addedInvoice.PrintInvoice();

		Console.WriteLine("Dodawanie pierwszej i drugiej faktury.");
		Invoice otherAddedInvoice = secondInvoice + thirdInvoice;
		otherAddedInvoice.PrintInvoice();

	}
	static void Main()
	{
		Tester t = new Tester();
		t.Run();
	}
}

