#include "utility.h"

main(int argc, char **argv)
{
        int padre;
        int k=0,i,rcv=0,z,x;
        int entra_in_campo,unoxvolta,privato;
        int nproc;
        int punteggio=0;
        int coda;
        bool flag=VERO;
        matrice * gioco;
        sms messaggio;
        int fine;
        notes block;
        smallnotes finale;

if (argc > 1)
{
        int nproc = atoi(argv[1]);
        initarray(block,nproc,0);
        if ((nproc % 2) == 0)
        {
                if (((entra_in_campo = creasem(CHIAVE,1)) != -1)&&
                    ((unoxvolta = creasem(KEYMTX,1)) != -1) &&
                    ((coda = creacoda(KEYCODA)) != -1))
                {
                        gioco = (matrice *)(attachshm(creashm(KEYSHM, sizeof(matrice))));
                        for (i=1;i <= nproc ; i++)
                        {
                                if ((padre = fork()) != -1)
                                {
                                        if (padre == 0) //codice figlio
                                        {
                                                down(entra_in_campo,0,-1);
                                                printf("Entra in campo    %d\n",getpid()); fflush(stdout);
                                                for (z=1;z<=2;z++)
                                                {
                                                        if (z==1)
                                                        {
                                                                privato= creasem(IPC_PRIVATE,1);
                                                                initsem(privato,0);
                                                        }
                                                        if (z==2)
                                                        {
                                                                printf("Rigioca    %d\n",getpid()); fflush(stdout);
                                                                flag=VERO;
                                                                punteggio=0;
                                                                initsem(unoxvolta,1);
                                                        }
                                                        while(flag==VERO )
                                                        {
                                                                down(unoxvolta,0,-1);
                                                                //printf("GIOCO %d\n",getpid()); fflush(stdout);
                                                                flag = visita(gioco,nproc,&punteggio);
                                                                up(unoxvolta,0,1);
                                                                sleep(1);
                                                        }
                                                                crea_sms(getpid(),punteggio,privato,&messaggio);
                                                                sms_send(coda,&messaggio);
                                                                printf("Esce dal campo    %d  Punteggio    %d\n",getpid(),punteggio);fflush(stdout);
                                                        down(privato,0,-1);
                                                }
                                                exit(0);
                                        }
                                } else printf("Errore nella fork\n");
                        }
                for (i=1; i <= nproc; i++)
                {

                        fine = sms_rcv(coda,&messaggio);
                        salva_sms(block,k,&messaggio,fine);
                        k++;
                        rcv++;
                        if ((rcv%2)==0)
                        {
                                inizializzacampo(gioco,nproc);
                                stampacampo(gioco,nproc);
                                up(entra_in_campo,0,2);
                        }
                        if (rcv == nproc)
                        {
                                qsort(block, nproc, sizeof(data), blockcompare);
                                stamparray(block,nproc);

                                inizializzacampo(gioco,nproc);
                                stampacampo(gioco,nproc);
                                up(block[0].sem_id,0,1);
                                up(block[1].sem_id,0,1);

                                fine = sms_rcv(coda,&messaggio);
                                salva_sms(finale,0,&messaggio,fine);

                                fine = sms_rcv(coda,&messaggio);
                                salva_sms(finale,1,&messaggio,fine);

                                if (finale[0].punti>finale[1].punti)
                                {
                                        printf("\nAnd the WINNER is %d\n\n",finale[0].pid);
                                        fflush(stdout);
                                }
                                else
                                {
                                        printf("\nAnd the WINNER is %d\n\n",finale[1].pid);
                                        fflush(stdout);
                                }
                                for(x=0;x<nproc;x++)
                                {
                                        kill(block[x].pid,SIGKILL);
                                        delsem(block[x].sem_id);
                                }
                        }

                }
                }else printf("Errore nell'accesso ai semafori\n");
        }else printf("\nAttenzione il programma necessita di parametro pari\n");
}else printf("\nAttenzione il programma necessita di parametro \n");

for(i=1;i<=nproc;i++) wait(0);

if (execl("2narbitro","2narbitro","0",NULL)== -1)
        printf("\n Errore nel lancio dell'arbitro\n");
}