#ifndef _PRAGMA_COPYRIGHT_
#define _PRAGMA_COPYRIGHT_
#pragma comment(copyright, "%Z% %I% %W% %D% %T%\0")
#endif /* _PRAGMA_COPYRIGHT_ */
/****************************************************************************

* Copyright (c) 2008, 2010 IBM Corporation.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0s
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html

 Classes: None

 Description: Enhanced Distributed Shell.
   
 Author: Nicole Nie, Tu HongJ, Liu Wei

 History:
   Date     Who ID    Description
   -------- --- ---   -----------
   02/13/09 chensuih        Initial code

****************************************************************************/

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <assert.h>
#include <strings.h>
#include "sci.h"

#include <string>

using namespace std;

int num_resp;

void handler(void *user_param, sci_group_t group, void *buffer, int size)
{
    int be_id = ((int *) buffer)[0];
    char *msg = (char *)((char *) buffer + sizeof(int));
    char *pos = NULL;

    while (1) {
        pos = strstr(msg, "\n");
        if (pos == NULL) {
            break;
        } else {
            pos[0] = '\0';
        }
        printf("%d: %s\n", be_id, msg);
        msg = pos + 1;
    }
    
    num_resp++;
}

int main(int argc, char **argv)
{
    sci_info_t info;
    sci_filter_info_t filter_info;

    char msg[256];
    char *s;
    int i, rc, num_bes, sizes[1];
    void *bufs[1];

    sci_group_t odd_group, even_group;
    int odd_size, even_size;
    int *odd_list = NULL, *even_list = NULL;

    char pwd[256];
    char hfile[256], bpath[256], fpath[256];

    getcwd(pwd, 256);
    sprintf(hfile, "%s/host.list", pwd);
#ifdef __64BIT__
    sprintf(bpath, "%s/dsh_be64", pwd);
#else
    sprintf(bpath, "%s/dsh_be", pwd);
#endif

    bzero(&info, sizeof(info));
    info.type = SCI_FRONT_END;
    info.fe_info.mode = SCI_INTERRUPT;
    info.fe_info.hostfile = hfile;
    info.fe_info.bepath = bpath;
    info.fe_info.hndlr = (SCI_msg_hndlr *)&handler;
    info.fe_info.param = NULL;
    
    rc = SCI_Initialize(&info);
    if (rc != SCI_SUCCESS) {
        exit(1);
    }
    
    rc = SCI_Query(NUM_BACKENDS, &num_bes);
    if (rc != SCI_SUCCESS) {
        exit(1);
    }
    //=========odd list===================
    odd_size = (num_bes - num_bes%2) / 2;
    odd_list = (int *)malloc(sizeof(int) * odd_size);
    for (i=0; i<odd_size; i++) {
        odd_list[i] = i*2 + 1;
    }
    rc = SCI_Group_create(odd_size, odd_list, &odd_group);
    if (rc != SCI_SUCCESS) {
        exit(1);
    }

    int odd_list_benum;
    rc = SCI_Group_query(odd_group, GROUP_MEMBER_NUM, &odd_list_benum);
    if (rc != SCI_SUCCESS) {
        exit(1);
    }
    printf("The Be Num of odd list is: %d\r\n", odd_list_benum);
    
    int* oddlist_query_res = (int *)malloc(sizeof(int)*odd_list_benum);
    rc = SCI_Group_query(odd_group, GROUP_MEMBER, oddlist_query_res);
    if (rc != SCI_SUCCESS) {
        exit(1);
    }
	
    for(i=0; i<odd_list_benum; i++)
    {
        printf("the group member %d of oddlist_query_res is: %d\r\n", i, oddlist_query_res[i]);
    }
    //===========even list====================
    even_size = (num_bes + num_bes%2) / 2;
    even_list = (int *)malloc(sizeof(int) * even_size);
    for (i=0; i<even_size; i++) {
        even_list[i] = i*2;
    }
    rc = SCI_Group_create(even_size, even_list, &even_group);
    if (rc != SCI_SUCCESS) {
        exit(1);
    }
	
    int even_list_benum;
    rc = SCI_Group_query(even_group, GROUP_MEMBER_NUM, &even_list_benum);
    if (rc != SCI_SUCCESS) {
        exit(1);
    }
    printf("The Be Num of even list is: %d\r\n", even_list_benum);

    int* evenlist_query_res = (int *)malloc(sizeof(int)*even_list_benum);
    rc = SCI_Group_query(even_group, GROUP_MEMBER, evenlist_query_res);
    if (rc != SCI_SUCCESS) {
        exit(1);
    }
	
    for(i=0; i<even_list_benum; i++)
    {
        printf("the group member %d of evenlist_query_res is: %d\r\n", i, evenlist_query_res[i]);
    }
    //=====================================
    string cur_grp = "all";
    int exp_resp = num_bes;
    while (1) {
        printf("(%s) ", cur_grp.c_str());
        fflush(stdout);
        memset(msg, 0 , sizeof(msg));
        fgets(msg, sizeof(msg), stdin);
        msg[strlen(msg) - 1] = '\0';

        if (strcmp(msg, "help") == 0) {
            printf("Commands:\n");
            printf("\t\thelp -- show help topics\n");
            printf("\t\tall -- send commands to all back ends\n");
            printf("\t\teven -- send commands to back ends with even id\n");
            printf("\t\todd -- send commands to back ends with odd id\n");
            printf("\t\tquit -- exit this program\n");
            continue;
        } else if (strcmp(msg, "all") == 0) {
            cur_grp = "all";
            exp_resp = num_bes;
            continue;
        } else if (strcmp(msg, "odd") == 0) {
            cur_grp = "odd";
            exp_resp = odd_size;
            continue;
        } else if (strcmp(msg, "even") == 0) {
            cur_grp = "even";
            exp_resp = even_size;
            continue;
        } else if (strcmp(msg, "quit") == 0) {
            break;
        }
        
        num_resp = 0;
        
        bufs[0] = msg;
        sizes[0] = strlen(msg) + 1;
        if (cur_grp == "all") {
            rc = SCI_Bcast(SCI_FILTER_NULL, SCI_GROUP_ALL, 1, bufs, sizes);
        } else if (cur_grp == "odd") {
            rc = SCI_Bcast(SCI_FILTER_NULL, odd_group, 1, bufs, sizes);
        } else if (cur_grp == "even") {
            rc = SCI_Bcast(SCI_FILTER_NULL, even_group, 1, bufs, sizes);
        } else {
            assert(!"Unknown group");
        }
        if (rc != SCI_SUCCESS) {
            exit(1);
        }
        
        while (num_resp < exp_resp) {
            usleep(500);
        } 
    }

    rc = SCI_Group_free(odd_group);
    if (rc != SCI_SUCCESS) {
        exit(1);
    }

    rc = SCI_Group_free(even_group);
    if (rc != SCI_SUCCESS) {
        exit(1);
    }

    free(odd_list);
    free(even_list);
    free(oddlist_query_res);
    free(evenlist_query_res);
    
    rc = SCI_Terminate();
    return rc;
}


