package masterworker;
import java.util.List;


/**
 *  Generic example of master/worker program.  
 *  "Tasks" just consist of sleeping for a specified time; times to wait are
 *  generatedly randomly from 1 to a specified maximum.
 *
 *  Command-line arguments:  total tasks, maximum task time,
 *    (optional) "--verbose" for verbose output
 *
 *  Sequential version.
 */
public class MasterWorkerSeq {

    /* variables/constants */

    private int numTasks;
    private int maxTaskTime;
    private boolean verbose;

    /** 
     * Main method.
     */
    public static void main(String[] args) {

        String usageMessage = "parameters:  numTasks maxTaskTime [--verbose]";
        final int REQUIRED_PARMS = 2;

        int numTasks = 0;
        int maxTaskTime = 0;
        boolean verbose = false;

        /* process command-line arguments */
        if (args.length < REQUIRED_PARMS) {
            System.err.println(usageMessage); System.exit(1);
        }
        try {
            numTasks = Integer.parseInt(args[0]);
            maxTaskTime = Integer.parseInt(args[1]);
        }
        catch (NumberFormatException e) {
            System.err.println(usageMessage); System.exit(1);
        }
        if (args.length > REQUIRED_PARMS) {
            if (args[REQUIRED_PARMS].equals("--verbose"))
                verbose = true;
            else {
                System.err.println(usageMessage); System.exit(1);
            }
        }

        /* do processing */
        new MasterWorkerSeq(numTasks, maxTaskTime, verbose).doProcessing();
    }

    /** Constructor.*/
    public MasterWorkerSeq(int _numTasks, int _maxTaskTime, boolean _verbose) {
        numTasks = _numTasks;
        maxTaskTime = _maxTaskTime;
        verbose = _verbose;
    }

    /** Do processing. */
    public void doProcessing() {

        int totalTaskTime = 0;

        /* start timing */
        long startTime = System.currentTimeMillis();

        /* build list of tasks */
        List<FakeTasks.Task> taskList = 
            FakeTasks.randomTasks(numTasks, maxTaskTime);

        /* process tasks */
        for (FakeTasks.Task t : taskList) {
            totalTaskTime += t.time;
            FakeTasks.TaskResult tr = t.execute();
            if (verbose) {
                System.out.printf("%s\n", FakeTasks.toString(t, tr));
            }
        }

        /* end timing and print result */
        long endTime = System.currentTimeMillis();
        System.out.printf("\nsequential version\n");
        System.out.printf("number of tasks = %d\n", numTasks);
        System.out.printf("max task time = %d\n", maxTaskTime);
        System.out.printf("total task time = %d\n", totalTaskTime);
        System.out.printf("running time = %g\n", 
                (double) (endTime - startTime) / 1000);
    }
}