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

namespace RazredKolo
{
    public class Kolo
    {
        private int _stPrestav;
        private string _barva;
        private string _tip;
        private int _stLjudi;

        public Kolo()
        /* osnovni konstruktor */
        {
            this._stPrestav = 18;
            this._barva = "črna";
            this._tip = "gorsko";
            this._stLjudi = 1;
        }

        public Kolo(int stPrestav, string barva, string tip, int stLjudi)
        /* konstruktor */
        {
            if (stPrestav == 18 | stPrestav == 21 | stPrestav == 24 | stPrestav == 27) { this._stPrestav = stPrestav; }
            else { throw new ArgumentException("V nizu ni podano smiselno število prestav."); }

            this._barva = barva;

            if (tip == "gorsko" | tip == "cestno" | tip == "treking") { this._tip = tip; }
            else { throw new ArgumentException("Tip kolesa mora biti: gorsko, cestno ali treking."); }

            if (stLjudi > 0) { this._stLjudi = stLjudi; }
            else { throw new ArgumentException("Na kolesu se ne more voziti 0 ali negativno število ljudi."); }
        }

        public Kolo(string opis)
        /* konstruktor podan kot niz, podatki so podani kot: stPrestav;barva;tip;stLjudi */
        {
            string[] tabela = opis.Split(';'); //opis glede na ; razbijem na več delov in jih shranim v tabelo nizov
            int prestave = int.Parse(tabela[0]); //niz pretvorim v število
            if (prestave == 18 | prestave == 21 | prestave == 24 | prestave == 27) { this._stPrestav = prestave; }
            else { throw new ArgumentException("V nizu ni podano smiselno število prestav."); }

            this._barva = tabela[1];

            string tip = tabela[2];
            if (tip == "gorsko" | tip == "cestno" | tip == "treking") { this._tip = tip; }
            else { throw new ArgumentException("Tip kolesa je lahko: gorsko, cestno ali treking."); }

            int stLjudi = int.Parse(tabela[3]);
            if (stLjudi > 0) { this._stLjudi = stLjudi; }
            else { throw new ArgumentException("Na kolesu se ne more voziti 0 ali negativno število ljudi."); }
        }


        //get in set metode
        //prestave
        public int povejPrestave()
        {
            return this._stPrestav;
        }
        public void nastaviPrestave(int novaPrestava)
        {
            if (novaPrestava == 18 | novaPrestava == 21 | novaPrestava == 24 | novaPrestava == 27) { this._stPrestav = novaPrestava; }
            else { throw new ArgumentException("V nizu ni podano smiselno število prestav."); }
        }
        //barva
        public string povejBarvo()
        {
            return this._barva;
        }
        public void nastaviBarvo(string barva)
        {
            this._barva = barva;
        }
        //tip
        public string povejTip()
        {
            return this._tip;
        }
        public void nastaviTip(string tip)
        {
            if (tip == "gorsko" | tip == "cestno" | tip == "treking") { this._tip = tip; }
            else { throw new ArgumentException("Tip kolesa je lahko: gorsko, cestno ali treking."); }
        }
        //stevilo ljudi
        public int povejSteviloLjudi()
        {
            return this._stLjudi;
        }
        public void nastaviSteviloLjudi(int stLjudi)
        {
            if (stLjudi > 0) { this._stLjudi = stLjudi; }
            else { throw new ArgumentException("Na kolesu se ne more voziti 0 ali negativno število ljudi."); }
        }


        public override string ToString()
        /* metoda za izpis */
        {
            return "Število prestav: " + this._stPrestav + ";   Barva: " + this._barva + ";     Tip: " + this._tip + ";     Število ljudi: " + this._stLjudi;
        }

        public int prestejBarveKoles(Kolo[] tabela, string barva)
        /* metoda vrne število, ki predstavlja število koles barve barva */
        {
            int stevec = 0;
            for (int i = 0; i < tabela.Length; i++) //pregledam celotno tabelo Koles
            {
                if (tabela[i].povejBarvo() == barva) //če barva ustreza podani barvi, povečam števec
                {
                    stevec++;
                }
            }
            return stevec;
        }

        public void prebarvaj(Kolo[] tabela)
        /* metoda prebarva vsa rumena kolesa v rdeča */
        {
            for (int i = 0; i < tabela.Length; i++)
            {
                if (tabela[i].povejBarvo() == "rumena")//če naletim na kolo rumene barve...
                {
                    tabela[i].nastaviBarvo("rdeca");//...ga prebarvam v rdečo
                }
            }
        }

        public int stLjudiZcestnimiKolesi(Kolo[] tabela)
        /* rezultat metode pove koliko ljudi se lahko hkrati peleje s cestnimi kolesi */
        {
            int stevec = 0;
            for (int i = 0; i < tabela.Length; i++)
            {
                if (tabela[i].povejTip() == "cestno")//če je kolo cestno, povečam števec
                {
                    stevec += tabela[i].povejSteviloLjudi();
                }
            }
            return stevec;
        }

        public int stModrihKoles(Kolo[] tabela)
        /* vrne število modrih koles, ki imajo 24 prestav */
        {
            int stevec = 0;
            for (int i = 0; i < tabela.Length; i++)
            {
                if (tabela[i].povejBarvo() == "modra" & tabela[i].povejPrestave() == 24)
                {
                    stevec++;
                }
            }
            return stevec;
        }


        public Kolo[] GenerirajTabeloKoles()
        /* ustvarim naključno tabelo z 20. kolesi */
        {
            string[] izbiraPrestav = { "18", "21", "24" };
            string[] izbiraBarv = { "bela", "crna", "rdeca", "rumena", "modra", "vijola", "zelena", "oranzna", "siva", "roza", "rjava" };
            string[] izbiraTipa = { "gorsko", "cestno", "treking" };
            string[] izbiraStLjudi = { "1", "2" };

            Kolo[] tabelaKoles = new Kolo[20];

            Random genPrestave = new Random();
            Random genBarve = new Random();
            Random genTip = new Random();
            Random genStLjudi = new Random();

            for (int i = 0; i < tabelaKoles.Length; i++)
            {
                int prestave = genPrestave.Next(0, 3); //generiram naključno število
                int barva = genBarve.Next(0, 11);
                int tip = genTip.Next(0, 3);
                int stLjudi = genStLjudi.Next(0, 2);
                //iz zogrnjih tabel vzamem tisti podatek, ki ima indeks, kot naključno število, ki ga dobim
                tabelaKoles[i] = new Kolo(int.Parse(izbiraPrestav[prestave]), izbiraBarv[barva], izbiraTipa[tip], int.Parse(izbiraStLjudi[stLjudi]));
            }
            return tabelaKoles;
        }
    }

        

    
}
