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);
		}
	}

	// Przeciążony operator równości
	public static bool operator ==(Invoice lhs, Invoice rhs)
	{
		if (lhs.vendor == rhs.vendor && lhs.amount == rhs.amount)
		{
			return true;
		}
		return false;
	}

	// Przeciążony operator nierówności. Deleguje operację do operatora ==
	public static bool operator !=(Invoice lhs, Invoice rhs)
	{
		return !(lhs == rhs);
	}

	// Metoda określająca równości. Sprawdza, czy obiekty mają ten sam typ,
	// a następnie deleguje operację do operatora ==
	public override bool Equals(object o)
	{
		if (!(o is Invoice))
		{
			return false;
		}
		return this == (Invoice)o;
	}

	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", 399.65);
		Invoice secondInvoice = new Invoice("FirmaGigant", 56389.53);
		Invoice thirdInvoice = new Invoice("FirmaGigant", 399.65);

		Invoice testInvoice = new Invoice("FirmaGigant", 399.65);

		if (testInvoice == firstInvoice)
		{
			Console.WriteLine("Pierwsza faktura jest taka sama.");
		}
		else if (testInvoice == secondInvoice)
		{
			Console.WriteLine("Druga faktura jest taka sama.");
		}
		else if (testInvoice == thirdInvoice)
		{
			Console.WriteLine("Trzecia faktura jest taka sama.");
		}
		else
		{
			Console.WriteLine("Żadna faktura nie jest taka sama.");
		}

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

