/*
 *Joel Adams, Calvin College 2013.
 *      Master Task draws a bulls-eye, with worker Tasks drawing concentric rings
 * Modified Jerrold Siegel Fall 2016
 */
#include <mpi.h>
#include <mpe.h>
#include <stdlib.h>  /* getenv() */
#include <string.h>  /* strcmp() */
#include <stdio.h>   /* printf(), etc. */

char* getDisplay() {
    char * display = getenv("DISPLAY");
    if ( strncmp(display, "(null)", 7) == 0 ) {
        fprintf(stderr, "\n*** Fatal: DISPLAY variable not set.\n");
        exit(1);
    }
    return display;
}
int main(int argc, char* argv[]) {
    const int  WINDOW_WIDTH = 800;
    const int  WINDOW_HEIGHT = 800;
    const int  CIRCLE_RADIUS = 5;
    const int  MOUSE_RIGHT_BUTTON = 3;
    int        x = 0, y = 0,height=100;
    int        rank = 0, button = 0,i;
    int buffer[2]={1,0};
    char int_string [33];
    char msg[20];
    MPE_XGraph canvas;
    MPI_Init(&argc,&argv);
    MPI_Comm_rank(MPI_COMM_WORLD, &rank);
    buffer[1]=rank;
    if ( rank == 0 ) {

        printf("Opening %dx%d window.\n", WINDOW_WIDTH, WINDOW_HEIGHT);
    }
    MPE_Open_graphics( &canvas, MPI_COMM_WORLD,
                       getDisplay(),
                       -1, -1,
                       WINDOW_WIDTH, WINDOW_HEIGHT, 0 );

    MPE_Line_thickness( canvas, 4 );
    if ( rank == 0 ){
        MPE_Fill_circle( canvas,
                         WINDOW_WIDTH / 2,
                         WINDOW_HEIGHT / 2,
                         8,
                         MPE_BLACK);
        /* int MPE_Draw_string( graph, x, y, color, string )*/
        MPE_Draw_string( canvas,
                         WINDOW_WIDTH / 2,
                         WINDOW_HEIGHT / 2, MPE_BLACK, " Task 0" );
    }else{

        MPE_Fill_circle( canvas,
                         WINDOW_WIDTH / 2+(rank * 55),
                         (WINDOW_HEIGHT /2 ),
                         8,
                         MPE_RED);
        MPE_Draw_circle( canvas,
                         WINDOW_WIDTH / 2, WINDOW_HEIGHT / 2,
                         (rank * 55),
                         MPE_RED);
        sprintf(int_string, "%d", rank);
        MPE_Draw_string( canvas,
                         ((WINDOW_WIDTH/2)+rank*45),
                         ((WINDOW_WIDTH/2)+rank*45),MPE_BLACK, int_string);
        MPE_Update(canvas);
    }
    /*Draw blue circles wherever the user left-clicks  */
    if ( rank == 0 ) {
        printf("Click:\n- left mouse button to draw blue circles;\n");
        printf("- right mouse button to quit.\n");
        do {
            MPE_Get_mouse_press( canvas, &x, &y, &button );
            if (button == MOUSE_RIGHT_BUTTON) {
                buffer[0]=0;
                MPI_Bcast(&buffer, 2, MPI_INT, 0, MPI_COMM_WORLD);
                if ( rank == 0 ) {
                    printf("Program complete.\n\n");
                }
            } else {
                for (i=0;i<5;i++) {
                    printf("%i %i  %i\n",x,(430+i*45), abs(x-(430+i*45)));
                    if (abs(x-(430+i*45))<25) {
                        buffer[1]=i;
                        MPI_Bcast(&buffer, 2, MPI_INT, 0, MPI_COMM_WORLD);
                        MPI_Recv(msg,20, MPI_CHAR, i, i, MPI_COMM_WORLD, MPI_STATUS_IGNORE);
                        MPE_Draw_string( canvas,100, height, MPE_BLACK, msg );
                        height=height+12;
                    }
                }
                MPE_Fill_circle( canvas, x, y, CIRCLE_RADIUS, MPE_BLUE );
            }
        } while (button != MOUSE_RIGHT_BUTTON);
    } else {
        snprintf(msg,20,"This is rank %d", rank);
        while (1) {
            MPI_Bcast(&buffer, 2, MPI_INT, 0, MPI_COMM_WORLD);
            if (!buffer[0])break;
            if (buffer[1]==rank) {
                MPI_Send(msg, 20, MPI_CHAR, 0, rank, MPI_COMM_WORLD);
            }
        }
    }
    /* clean up */
    MPE_Close_graphics( &canvas);
    MPI_Finalize();
    return 0;
}