﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication11
{
    class Program
    {
        static void Main(string[] args)
        {
            PravaProdavnica maxi = new PravaProdavnica("Maxi");
            ElektronskaProdavnica ekupi = new ElektronskaProdavnica("EKupi");
            Proizvod p1 = new Proizvod(24000, "MB", "MojaBicikla", "bicikla", 6000);
            Proizvod p2 = new Proizvod(16000, "LMax", "BikeWorld", "bicikla", 5700);
            Proizvod p3 = new Proizvod(220, "Kacket", "Kappa", "kapa", 200);
            maxi.DodajProizvod(p1);
            maxi.DodajProizvod(p2);
            maxi.DodajProizvod(p3);
            ekupi.DodajProizvod(p1);
            ekupi.DodajProizvod(p2);
            ekupi.DodajProizvod(p3);
            Console.WriteLine("Maxi Popis:");
            foreach (var x in maxi.Popis())
            {
                Console.WriteLine(x.ToString());
            }
            Console.WriteLine();
            List<Prodavnica> l = new List<Prodavnica>() { maxi, ekupi };
            List<Proizvod> p = new List<Proizvod>();
            Prodavnica najjeftinijaProdavnica = maxi;
            Proizvod najjeftinijiProizvod = p1;
            foreach (var prodavnica in l)
            {
                foreach (var proizvod in prodavnica.NadjiVrstuProizvoda("bicikla"))
                {
                    if (prodavnica.Cena(proizvod, 150) < najjeftinijaProdavnica.Cena(najjeftinijiProizvod, 150))
                    {
                        najjeftinijaProdavnica = prodavnica;
                        najjeftinijiProizvod = proizvod;
                    }
                }
            }
            Console.WriteLine("Najbolja bicikla:");
            Console.WriteLine(najjeftinijaProdavnica.ToString());
            Console.WriteLine(najjeftinijiProizvod.ToString());
            Console.ReadKey();
        }
    }

    abstract class Prodavnica
    {
        public string naziv
        {
            get;
            set;
        }

        protected bool elektronska;
        protected List<Proizvod> proizvodi = new List<Proizvod>();

        public Prodavnica(string x)
        {
            naziv = x;
        }

        public void DodajProizvod(Proizvod x)
        {
            proizvodi.Add(x);
        }

        public bool KupiProizvod(string name)
        {
            foreach (var x in proizvodi)
            {
                if (x.naziv == name)
                {
                    proizvodi.Remove(x);
                    return true;
                }
            }
            return false;
        }

        public List<Proizvod> NadjiVrstuProizvoda(string type)
        {
            List<Proizvod> l = new List<Proizvod>();
            foreach (var x in proizvodi)
            {
                if (x.vrsta == type)
                {
                    l.Add(x);
                }
            }
            return l;
        }

        public int ImaLiProizvoda(string type)
        {
            int count = 0;
            foreach (var x in proizvodi)
            {
                if (x.vrsta == type)
                {
                    count++;
                }
            }
            return count;
        }

        public int ProizvodiProizvodjaca(string m)
        {
            int count = 0;
            foreach (var x in proizvodi)
            {
                if (x.proizvodjac == m)
                {
                    count++;
                }
            }
            return count;
        }

        public abstract double Cena(string name, double r);
        public abstract double Cena(Proizvod p, double r);

        public List<Proizvod> Popis()
        {
            return proizvodi;
        }

        public override string ToString()
        {
            return naziv;
        }
    }

    class ElektronskaProdavnica : Prodavnica
    {
        public ElektronskaProdavnica(string x) : base(x)
        {
            naziv = x;
            elektronska = true;
        }

        public override double Cena(Proizvod p, double r)
        {
            foreach (var x in proizvodi)
            {
                if (x == p)
                {
                    double cena = x.cena;
                    cena *= 1.2;
                    cena += 3 * r;
                    return cena;
                }
            }
            return 0;
        }

        public override double Cena(string name, double r)
        {
            foreach (var x in proizvodi)
            {
                if (x.naziv == name)
                {
                    double cena = x.cena;
                    cena *= 1.2;
                    cena += 3 * r;
                    return cena;
                }
            }
            return 0;
        }
    }

    class PravaProdavnica : Prodavnica
    {
        public PravaProdavnica(string x) : base(x)
        {
            naziv = x;
            elektronska = false;
        }

        public override double Cena(Proizvod p, double r)
        {
            foreach (var x in proizvodi)
            {
                if (x == p)
                {
                    double cena = x.cena;
                    cena *= 1.2 * 1.2;
                    return cena;
                }
            }
            return 0;
        }

        public override double Cena(string name, double r)
        {
            foreach (var x in proizvodi)
            {
                if (x.naziv == name)
                {
                    double cena = x.cena;
                    cena *= 1.2 * 1.2;
                    return cena;
                }
            }
            return 0;
        }
    }

    class Proizvod
    {
        public double cena
        {
            get;
            set;
        }
        public string naziv
        {
            get;
            set;
        }
        public string proizvodjac
        {
            get;
            set;
        }
        public string vrsta
        {
            get;
            set;
        }
        public double masa
        {
            get;
            set;
        }

        public Proizvod(double price, string name, string manufacturer, string type, double mass)
        {
            cena = price;
            naziv = name;
            proizvodjac = manufacturer;
            vrsta = type;
            masa = mass;
        }

        public override string ToString()
        {
            return naziv + " (" + vrsta + ", " + proizvodjac + ", " + masa + ")";
        }
    }
}
