#ifndef LISTA_POLJE_H_INCLUDED
#define LISTA_POLJE_H_INCLUDED
#endif // LISTA_POLJE_H_INCLUDED

struct lista_polje {
    podaci pod[1024];
    int kursor;
};




//funkcije za zadatak
int InsertL(lista_polje *);
void IspisOdKraja(lista_polje *);
int OpremaNakon2009(lista_polje *);
bool DeleteL(lista_polje *, int );
void RazduziZaposlenika(lista_polje *, int);
void SilaznoSortiranje(lista_polje *);


void initL(lista_polje *lp)
{
    lp->kursor = 0;
}

int InsertL(lista_polje *lp)
{
        if(lp->kursor >= 1024)
            return false;

        static int sifra = 1;

        podaci pod;


        pod.sifra = sifra;
        cout << "Naziv opreme: ";
        cin >> pod.oprema;
        cout << "Naziv proizvodjaca: ";
        cin >> pod.proizvodj;
        cout << "Godina proizvodnje: ";
        cin >> pod.god_proizv;
        cout << "MBR zaposlenika: ";
        cin >> pod.mbr_zaposlenika;

        lp->pod[lp->kursor++] = pod;

        ++sifra;
        return true;

}

void IspisOdKraja(lista_polje *lp)
{
    for(int i = lp->kursor - 1; i >= 0; --i)
        print_podaci(lp->pod[i]);
}


int OpremaNakon2009(lista_polje *lp)
{
     cout << "\n\n----------Racunalna oprema proizvodena nakon 2009. godine--------\n\n" << endl;
     int broj_oprema = 0;
     for(int i = 0; i < lp->kursor; ++i)
     {
         if(lp->pod[i].god_proizv >= 2009) {
                print_podaci(lp->pod[i]);

                ++broj_oprema;
                cout << "----------------";
         }

     }
     return broj_oprema;
}

bool DeleteL(lista_polje *lp, int sifra)
{
    for(int i = 0; i < lp->kursor; ++i)
    {
        if(lp->pod[i].sifra == sifra) {
            for(int j = i + 1; j < lp->kursor; ++j)
            {
                lp->pod[j - 1] = lp->pod[j];
            }
            lp->kursor--;
            return true;
        }
    }
    return false;

}

void RazduziZaposlenika(lista_polje *lp, int mbr)
{
    for(int i = 0; i < lp->kursor; ++i)
    {
        if(lp->pod[i].mbr_zaposlenika == mbr)
        {
            DeleteL(lp, lp->pod[i].sifra);
            --i;
        }

    }

}


void SilaznoSortiranje(lista_polje *lp)
{
     int i, j, flag = 1;    // set flag to 1 to start first pass
     podaci temp;             // holding variable
     int numLength = lp->kursor;
     for(i = 1; (i <= numLength) && flag; i++)
     {
          flag = 0;
          for (j=0; j < (numLength - 1); j++)
         {
               if (strcmp(lp->pod[j+1].proizvodj, lp->pod[j].proizvodj) < 0)      // ascending order simply changes to <
              {
                    temp = lp->pod[j];             // swap elements
                    lp->pod[j] = lp->pod[j+1];
                    lp->pod[j+1] = temp;
                    flag = 1;               // indicates that a swap occurred.
               }
          }
     }
}

//dodatne funkcije


int EndL(lista_polje *lp)
{
    return lp->kursor;
}

int FirstL(lista_polje *lp)
{
    if(lp->kursor == 0)
        return EndL(lp);
    return 0;
}

int NextL(int p, lista_polje *lp)
{
    if(p >= lp->kursor)
        return EndL(lp);
    if(lp->kursor == 0)
        throw new EmptyException;
    return p + 1;

}


int PreviousL(int p, lista_polje *lp)
{
    if(p > lp->kursor)
        return EndL(lp);
    if(p == 0)
        throw new PreviousException;
    return p - 1;
}
int LocateL(int sifra, lista_polje *lp)
{
    for(int i = 0; i < lp->kursor; ++i) {
        if(lp->pod[i].sifra == sifra)
            return i;
    }
    return -1;
}

void DeleteAll(lista_polje *lp)
{
    lp->kursor = 0;
}


podaci RetreiveL(int p, lista_polje *lp)
{
    if(p >= lp->kursor)
        throw new RangeException;
    if(lp->kursor == 0)
        throw new EmptyException;
    return lp->pod[p];
}