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

namespace ZadatakZa5
{
    class Program
    {
        static void Main(string[] args)
        {
            List<string> putnici = new List<string>(new string[] { "Ksenija", "Jovana", "Stefan", "Janko", "Pavle" });
            List<PrevoznoSredstvo> auticiIBajsevi = new List<PrevoznoSredstvo>();
            auticiIBajsevi.Add(new Taksi("Lol1", 4, 20, 100));
            auticiIBajsevi.Add(new TaksiLinijski("Lol2", 4, 60,10));
            auticiIBajsevi.Add(new PrevoznoSredstvo(2, "Drumski", "Bajs"));
            List<INaplativo> naplativnaSredstva = new List<INaplativo>();
            foreach (PrevoznoSredstvo vozilo in auticiIBajsevi)
            {
                if (vozilo is INaplativo)
                    naplativnaSredstva.Add((INaplativo)vozilo);
            }


        }
    }

    class PrevoznoSredstvo
    {
        public int Kapacitet { get; set; }
        public string Naziv { get; set; }
        public string VrstaSaobracaja { get; set; }
        List<string> putnici = new List<string>();

        public PrevoznoSredstvo(int kapacitet, string vrstaSaobracaja, string naziv)
        {
            Kapacitet = kapacitet;
            VrstaSaobracaja = vrstaSaobracaja;
            Naziv = naziv;
        }

        public void DodavanjePutnika()
        {
            foreach (string putnik in putnici)
            {
                if (putnici.Count < Kapacitet)
                    putnici.Add(putnik);
            }
        }

        public void ObrisiIzListe(string imePutnika)
        {
            if (putnici.IndexOf(imePutnika) > -1)
                putnici.RemoveAt(putnici.IndexOf(imePutnika));
        }

        public int VratiBrMesta()
        {
            return Kapacitet - putnici.Count;
        }

        public override String ToString()
        {
            string pocetak = Naziv + " (";
            string putniciNazivi = "";
            for (int i = 0; i < putnici.Count; i++)
            {
                putniciNazivi += (putnici[i] + ", ");
                if (i == putnici.Count - 1)
                    putniciNazivi += (putnici[i] + ")");
            }
            return pocetak + putniciNazivi;
        }
    }

    public interface INaplativo
    {
        double CenaPoJedinici();
        void UkupnaCena(int brPutnika, int km);
        bool mogucaKilometraza(int km);
    }

    class Automobili : PrevoznoSredstvo
    {
        public string Registracija { get; set; }

        public Automobili(int kapacitet, string registracija)
            : base(kapacitet, "Drumski","Automobil")
        {
            Registracija = registracija;
        }

        public override String ToString()
        {
            return Registracija + " " + base.ToString();
        }

    }

    class TaksiLinijski : Automobili, INaplativo
    {
        public double CenaPoPutniku { get; set; }
        public int MaksimalnaKilometraza { get; set; }

        public TaksiLinijski(string registracija, int kapacitet, int cenaPoPutniku, int maks)
            : base(kapacitet, registracija)
        {
            CenaPoPutniku = cenaPoPutniku;
            MaksimalnaKilometraza = maks;
        }

        public double CenaPoJedinici()
        {
            return CenaPoPutniku;
        }

        public double UkupnaCena(int brPutnika, int kilometraza)
        {
            if (kilometraza > MaksimalnaKilometraza)
                return Double.MaxValue;
            return brPutnika * CenaPoPutniku;

        }

        public bool mogucaKilometraza(int kilometraza)
        {
            if (kilometraza > MaksimalnaKilometraza)
                return true;
            return false;
        }
    }

    class Taksi : Automobili, INaplativo
    {
        public double CenaPoKilometru { get; set; }
        public double PocetnaCena { get; set; }

        public Taksi(string registracija, int kapacitet, int cenaPoKilometru, int startCena) :
            base(kapacitet, registracija)
        {
            CenaPoKilometru = cenaPoKilometru;
            PocetnaCena = startCena;
        }

        public double CenaPoJedinici()
        {
            return CenaPoKilometru;
        }

        public double UkupnaCena(int brPutnika, int kilometraza)
        {
            if (kilometraza > 2)
                return PocetnaCena * CenaPoKilometru * ((kilometraza - 2) * PocetnaCena);
            return PocetnaCena * CenaPoKilometru * kilometraza;
        }

        public bool mogucaKilometraza()
        {
            return true;
        }

    }
}
