#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/sem.h>
#include <sys/shm.h>
#include <sys/msg.h>
#include <unistd.h>
#include <time.h>
#include <signal.h>
#include <sys/wait.h>

struct delemem
{
    int niz[12];
    int size;
};

struct glav_rad
{
    
    int niz[3];
    int n;
};

struct radnim
{
    long mtype;
    int niz[4];
    int f;
};

int suma(int *niz,int size)
{
    int suma = 0;
    for(int i=0;i<size;i++)
    {
        suma += niz[i];
    }
    return suma;
}
int proizvod(int *niz,int size)
{
    int proizvod = 1;
    for(int i=0;i<size;i++)
    {
        proizvod *= niz[i];
    }
    return proizvod;
}
int minimum(int *niz,int size)
{
    int p = niz[0];
    for(int i=1;i<size;i++)
    {
        if(p<niz[i])
        {
            p = niz[i];
        }
    }
    return p;
}
int maximum(int *niz,int size)
{
    int p = niz[0];
    for(int i=1;i<size;i++)
    {
        if(p>niz[i])
        {
            p = niz[i];
        }
    }
    return p;
}

int main()
{
    key_t sem_key = ftok("glavni_cvor.c",3);

    key_t msg_rad_key = ftok("glavni_cvor.c",4);
    
    key_t shm_rad_key = ftok("glavni_cvor.c",5);

    int sem_id = semget(sem_key,3,IPC_CREAT|0666);
    int msg_rad_id = msgget(msg_rad_key,IPC_CREAT|0666);
    int shm_rad_id = shmget(shm_rad_key,sizeof(struct glav_rad),IPC_CREAT|0666);

    struct sembuf V2 = {2,1,0};

    struct glav_rad *gr = (struct glav_rad*)shmat(shm_rad_id,NULL,0); 
    struct radnim rad;

    printf("Radni cvor: ceka poruku.\n");
    msgrcv(msg_rad_id,&rad,sizeof(rad)-sizeof(long),1,0);

    printf("Radni cvor: je primio poruku i izvrsava operaciju.\n");

     if(rad.f == 0)
        {
            printf("Radni cvor: Korisnik je trazio sumu brojeva.\n");
            gr->niz[gr->n] = suma(rad.niz,4);
            gr->n++;
            
        }
        else if (rad.f == 1)
        {
            printf("Radni cvor: Korisnik je trazio proizvod brojeva.\n");
            gr->niz[gr->n] = suma(rad.niz,4);
            gr->n++;
            
        }
        else if (rad.f == 2)
        {
            printf("Radni cvor: Korisnik je trazio minimum brojeva.\n");
            gr->niz[gr->n] = suma(rad.niz,4);
            gr->n++;
            
        }
        else
        {
            printf("Radni cvor: Korisnik je trazio maximum brojeva.\n");
            gr->niz[gr->n] = suma(rad.niz,4);
            gr->n++;
            
        }

        printf("Radni cvor: Gotov je sa operacijama.\n");

        semop(sem_id,&V2,1);

        shmdt(gr);

    return 0;
}
