private List <List <double> > ProtocniDinamickiRaspored(RaspodeliProtocnoModel parametri)
        {
            var lab = db.LabVezba.Find(parametri.LabVezbaId);

            int      kapacitet = parametri.Kapacitet;
            DateTime pocetak   = parametri.Pocetak;
            DateTime kraj      = parametri.Kraj;
            int      trajanje  = parametri.Trajanje;
            int      slot      = parametri.Slot;


            List <double> listaSurvivalRate = SurvivalRate(StudentiUSlotu(VremeZadrzavanja(lab.Tag, lab.Naziv, parametri.Redosled), slot));


            List <List <double> > sli    = new List <List <double> >();
            List <List <double> > slipom = new List <List <double> >();

            int brojSlotova = (int)((kraj - pocetak).TotalMinutes - trajanje) / slot + 1;

            DateTime vremepom = pocetak;

            int indeks_slota_termina = 0;

            while (vremepom != parametri.IzabraniTermin)
            {
                DateTime d = vremepom.AddMinutes(slot);
                vremepom = d;
                indeks_slota_termina++;
            }

            double k;

            for (int i = 0; i < brojSlotova; i++)
            {
                List <double> pom = new List <double>();

                if (i == indeks_slota_termina)
                {
                    kapacitet = parametri.NoviKapacitet;
                }
                if (i == 0)
                {
                    for (int j = 0; j < listaSurvivalRate.Count(); j++)
                    {
                        pom.Add(Math.Round(kapacitet * listaSurvivalRate[j]));
                    }

                    sli.Add(pom);
                }
                else
                {
                    double sum = 0.00;
                    for (int j = 1; j < (i + 1); j++)
                    {
                        if (j >= sli[i - j].Count())
                        {
                            sum += 0;
                        }
                        else
                        {
                            sum += sli[i - j][j];
                        }
                    }
                    k = Convert.ToDouble(kapacitet) - sum;
                    if (k <= 0)
                    {
                        k = 0;
                    }

                    for (int l = 0; l < listaSurvivalRate.Count(); l++)
                    {
                        pom.Add(Math.Round(k * listaSurvivalRate[l]));
                    }

                    sli.Add(pom);
                }
            }

            for (int t = indeks_slota_termina; t < sli.Count(); t++)
            {
                slipom.Add(sli[t]);
            }
            return(slipom);
        }
        public IActionResult SmanjenKapacitet([FromBody] RaspodeliProtocnoModel parametri)
        {
            //parametri.LabVezbaId = 1;
            //parametri.Redosled = 1;
            //parametri.Ucionica = "565asd";
            //parametri.Trajanje = 30;
            //parametri.Kapacitet = 2;
            //parametri.Slot = 5;
            //parametri.Kraj = new DateTime(2020, 11, 11, 23, 0, 0);

            // DateTime pocetakSpec = DateTime.Now;
            int?index = 0;

            var specificna = db.LabSpecificna.FirstOrDefault(x => x.Id == parametri.LabVezbaSpecificnaId);

            parametri.IzabraniTermin = specificna.VremeOd.Value;

            DateTime pocetakSpec = parametri.IzabraniTermin;

            if (specificna != null)
            {
                parametri.Redosled = specificna.Redosled.Value;
                //parametri.Pocetak = specificna.VremeOd.Value;

                var spec = db.LabSpecificna.Where(x => x.IdLabVezbe == parametri.LabVezbaId &&
                                                  x.Redosled == parametri.Redosled &&
                                                  x.VremeOd >= parametri.IzabraniTermin)
                           .Include(x => x.Raspored)
                           .ThenInclude(x => x.StudentNavigation);

                if (spec.Count() > 0)
                {
                    var spec1 = spec.FirstOrDefault();
                    var ras   = spec1.Raspored.FirstOrDefault();
                    index = ras.StudentNavigation.Indeks;

                    parametri.Redosled = spec1.Redosled.Value;
                    parametri.Ucionica = ras.Ucionica;

                    foreach (var s in spec)
                    {
                        db.Raspored.RemoveRange(s.Raspored);
                    }
                }
                else
                {
                    return(BadRequest());
                }

                db.LabSpecificna.RemoveRange(spec);
                // db.SaveChanges();
            }
            else
            {
                return(BadRequest());
            }

            //POKUPI STUDENTE KOJI NISU USLI NA DANASNJU VEZBU
            var query = db.Student.AsQueryable();

            query = query.Where(s => s.LabVezbaStudent.Any(x => x.LabVezbaId == specificna.IdLabVezbe) && s.Indeks >= index);

            query = query.OrderBy(x => x.Indeks);

            var list = query.ToList();

            var res  = ProtocniDinamickiRaspored(parametri).Select(x => x.First()).ToList();
            var skip = 0;
            var i    = 0;

            foreach (var num in res)
            {
                specificna = new LabSpecificna
                {
                    IdLabVezbe = parametri.LabVezbaId,
                    Redosled   = parametri.Redosled,
                    //razmisli
                    VremeOd = pocetakSpec.AddMinutes(i * parametri.Slot)
                };

                db.LabSpecificna.Add(specificna);

                var studentiUSlot = list.Skip(skip).Take((int)num);
                skip += (int)num;

                foreach (var student in studentiUSlot)
                {
                    var raspored = new Raspored
                    {
                        StudentNavigation  = student,
                        Ucionica           = parametri.Ucionica,
                        LabVezbaNavigation = specificna
                    };
                    db.Raspored.Add(raspored);


                    raspored.Izmenjen = true;

                    //notifier.Send(student.Username, $"Obaveštenje o lab vežbama. Došlo je do izmene za {specificna.IdLabVezbeNavigation.Naziv} - {specificna.Redosled} termin {specificna.VremeOd}");
                }

                i++;
            }

            //db.SaveChanges();
            return(Ok());
        }
        public List <List <double> > ProtocniRaspored([FromBody] RaspodeliProtocnoModel parametri)
        {
            var lab = db.LabVezba.Find(parametri.LabVezbaId);

            int      kapacitet = parametri.Kapacitet;
            DateTime pocetak   = parametri.Pocetak;
            DateTime kraj      = parametri.Kraj;
            int      trajanje  = parametri.Trajanje;
            int      slot      = parametri.Slot;


            List <double> listaSurvivalRate = SurvivalRate(StudentiUSlotu(VremeZadrzavanja(lab.Tag, lab.Naziv, parametri.Redosled), slot));

            List <List <double> > sli = new List <List <double> >();

            int    brojSlotova = (int)((kraj - pocetak).TotalMinutes - trajanje) / slot + 1;
            double k;

            for (int i = 0; i < brojSlotova; i++)
            {
                List <double> pom = new List <double>();

                if (i == 0)
                {
                    for (int j = 0; j < listaSurvivalRate.Count(); j++)
                    {
                        pom.Add(Math.Round(kapacitet * listaSurvivalRate[j]));
                    }

                    sli.Add(pom);
                }
                else
                {
                    double sum = 0.00;
                    for (int j = 1; j < i + 1; j++)
                    {
                        if (j >= sli[i - j].Count())
                        {
                            sum += 0;
                        }
                        else
                        {
                            sum += sli[i - j][j];
                        }
                    }
                    k = Convert.ToDouble(kapacitet) - sum;
                    if (k <= 0)
                    {
                        k = 0;
                    }

                    for (int l = 0; l < listaSurvivalRate.Count(); l++)
                    {
                        pom.Add(Math.Round(k * listaSurvivalRate[l]));
                    }

                    sli.Add(pom);
                }
            }
            return(sli);
        }
        public IActionResult Test([FromBody] RaspodeliProtocnoModel parametri)
        {
            var res = ProtocniRaspored(parametri).Select(x => x.First()).ToList();

            //TODO: POKUPI STUDENTE
            var query = db.Student.AsQueryable();

            query = query.Where(s => s.LabVezbaStudent.Any(x => x.LabVezbaId == parametri.LabVezbaId));

            query = query.OrderBy(x => x.Indeks);

            var list = query.ToList();

            //TODO: ZA SVAKOG DODAJ RASPORED

            var spec = db.LabSpecificna.Where(x => x.IdLabVezbe == parametri.LabVezbaId && x.Redosled == parametri.Redosled);

            db.LabSpecificna.RemoveRange(spec);
            db.SaveChanges();

            var skip = 0;
            var i    = 0;

            foreach (var num in res)
            {
                var specificna = new LabSpecificna
                {
                    IdLabVezbe = parametri.LabVezbaId,
                    Redosled   = parametri.Redosled,
                    //razmisli
                    VremeOd = parametri.Pocetak.AddMinutes(i * parametri.Slot)
                };
                i++;

                if (num == 0)
                {
                    continue;
                }

                var studentiUSlot = list.Skip(skip).Take((int)num);
                skip += (int)num;

                if (!studentiUSlot.Any())
                {
                    break;
                }

                foreach (var student in studentiUSlot)
                {
                    if (student.Indeks >= parametri.minIndeks)
                    {
                        var raspored = db.Raspored.FirstOrDefault(x => x.Student == student.Id && x.LabVezba == specificna.Id);

                        if (raspored == null)
                        {
                            raspored = new Raspored
                            {
                                StudentNavigation  = student,
                                Ucionica           = parametri.Ucionica,
                                LabVezbaNavigation = specificna
                            };
                            db.Raspored.Add(raspored);
                        }

                        raspored.Izmenjen = true;

                        //notifier.Send(student.Username, $"Obaveštenje o lab vežbama. Došlo je do izmene za {specificna.IdLabVezbeNavigation.Naziv} - {specificna.Redosled} termin {specificna.VremeOd}");
                    }
                }
            }

            db.SaveChanges();
            return(Ok());
        }