/****************************************************************************/
/* Copyright (c) 2000 MBARI                                                 */
/* MBARI Proprietary Information. All rights reserved.                      */
/****************************************************************************/
/* Summary  :                                                               */
/* Filename : bdoc.cc                                                       */
/* Author   :                                                               */
/* Project  :                                                               */
/* Version  : 1.0                                                           */
/* Created  : 02/07/2000                                                    */
/* Modified :                                                               */
/* Archived :                                                               */
/****************************************************************************/
/* Modification History:                                                    */
/****************************************************************************/
#include <stdio.h>
#include "LayeredControl.h"
#include "Behavior.h"
#include "BehaviorFactory.h"

// Include individual Behavior header files to get symbolic names
// needed by BehaviorFactory
#include "Ascend.h"
#include "ChirpFin.h"
#include "DepthEnvelope.h"
#include "Descend.h"
#include "GetGPS.h"
#include "Launch.h"
#include "MissionTimer.h"
#include "SetElevator.h"
#include "SetRudder.h"
#include "Setpoint.h"
#include "Waypoint.h"
#include "Yoyo.h"
#include "Zigzag.h"

int main(int argc, char **argv)
{
  // Instantiate Behavior object of each subclass, and print out
  // info about it.

  char *behaviorName[] = {
    AscendBehaviorName,
    ChirpFinBehaviorName,
    DepthEnvelopeBehaviorName,
    DescendBehaviorName,
    GetGPSBehaviorName,
    LaunchBehaviorName,
    MissionTimerBehaviorName,
    SetElevatorBehaviorName,
    SetRudderBehaviorName,
    SetpointBehaviorName,
    WaypointBehaviorName,
    YoyoBehaviorName,
    ZigzagBehaviorName,
    0
  };

  BehaviorFactory *factory = BehaviorFactory::instanceOf();

  Behavior *behavior;

  Boolean printSpecific = False;

  if (argc > 1) {
    printSpecific = True;
  }

  for (int i = 0; behaviorName[i] != 0; i++) {

    if (printSpecific) {
      // Check if this behavior was specified
      Boolean printIt = False;
      for (int j = 1; j  < argc; j++) {
	if (!strcmp(behaviorName[i], argv[j])) {
	  printIt = True;
	}
      }
      if (!printIt)
	// Not on list of requested behaviors; go to next one
	continue;
    }

    if ((behavior = factory->create(behaviorName[i])) == 0) {
      // Invalid behavior name!
      fprintf(stderr, "Invalid behavior name: \"%s\"\n", behaviorName[i]);
      return 1;
    }
    printf("--------------------------------------------------------\n");
    printf("Behavior: %s    ", behavior->name());

    if (behavior->sequential())
      printf("Sequential\n");
    else
      printf("Nonsequential\n");

    printf("\nValid attributes:\n\n");

    Attribute *attribute;

    for (int i = 0; i < behavior->attributes.list.size(); i++) {

      behavior->attributes.list.get(i, &attribute);

      printf("%s - %s\n", attribute->name(), attribute->description());
      printf("Attribute type: %s\n", attribute->typeMnem());

      if (attribute->hasDefault()) {
	printf("Default value: %s\n", attribute->valueString());
      }
      else {
	printf("Default value: none - input is mandatory\n");
      }

      printf("\n");
    }

    printf("\n");

    // Causes seg violation!
    // delete behavior;
  }

  return 0;
}

