class Program
{
    public static void Main()
    {
        Enekesno e1 = new Enekesno("Lady Gaga");
        Enekesno e2 = new Enekesno("Nicki Minaj");
        Rajongo r1 = new Rajongo("János");
        Rajongo r2 = new Rajongo("Patrik");
        Rajongo r3 = new Rajongo("Bogi");
        e1.Subscribe(r1);
        e1.Subscribe(r2);
        e2.Subscribe(r2);
        e2.Subscribe(r3);
        e1.SetKovetkezoKoncertHelyszine("Budapest");
        e2.SetKovetkezoKoncertHelyszine("Eger");
    }
    class Enekesno : IObservable<string>
    {
        List<IObserver<string>> observer = new List<IObserver<string>>();
        string kovetkezoKoncertHelyszine;
        string nev;
        public Enekesno(string nev) { this.nev = nev; }
        public string SetKovetkezoKoncertHelyszine(string varos)
        {
            kovetkezoKoncertHelyszine = varos;
            this.notify();
            return null;
        }
        public IDisposable Subscribe(IObserver<string> obs)
        {
            observer.Add(obs);
            return null;
        }
        private void notify()
        {
            foreach(var item in observer)
            {
                try { 
                item.OnNext("szia");
                item.OnNext("A nevem:");
                item.OnNext(this.nev);
                item.OnNext("következő koncert helyszíne:");
                item.OnNext(this.kovetkezoKoncertHelyszine);
                item.OnCompleted();
                }
                catch (Exception e) { item.OnError(e); }
            }
        }
    }
    class Rajongo : IObserver<string>
    {
        string enekesnoNeve;
        bool eneksnoNeveFlag = false;
        string kovetkezoKoncertHelyszine;
        bool kovetkezoKoncertHelyszineFlag = false;

        string nev;
        public Rajongo (string nev) { this.nev = nev; }
        public void OnCompleted()
        {
            Console.WriteLine( nev +" Nagyon boldog mert " + enekesnoNeve + " koncertet ad " + kovetkezoKoncertHelyszine + " city-ben:)");
        }

        public void OnError(Exception error){}

        public void OnNext(string value)
        {
            if(eneksnoNeveFlag) { enekesnoNeve=value; }
            if(kovetkezoKoncertHelyszineFlag) { kovetkezoKoncertHelyszine=value; }

            if (value.Equals("A nevem:")) { eneksnoNeveFlag = true; }
            else { eneksnoNeveFlag = false; }
            if (value is "következő koncert helyszíne:") { kovetkezoKoncertHelyszineFlag= true; }
            else { kovetkezoKoncertHelyszineFlag = false; }
        }
    }
}