=begin
 ******************************************************************************
 * Copyright 1990-2009 MBARI
 * MBARI Proprietary Information. All rights reserved.
 ******************************************************************************
 * Summary  : Report behavior class
 * Filename : report.rb
 * Author   : Henthorn
 * Project  : Benthic Rover
 * Version  : 1
 * Created  : Dec 2010
 * Modified :
 ******************************************************************************
=end

##
# Refer to Rover-code home directory as base
#
require "#{ENV['ROVER_HOME']}/utils/rover_environment"
#

require "utils/misc"
require "control/behavior"
require "control/supervisor"

##########
# Unsolicited acoustic modem message
#
class Report < Behavior
  include SyslogWriter

  ##
  # Construct a SampleBehavior object given from a document element
  #
  def initialize(p_behavior_element)
    super

    @message = nil
    @status_msg = true
    @name = self.class.name
    load_attrs(p_behavior_element)

  end

  #####
  # A crude documentation feature. Each subclass should provide
  # one that begins by calling this method.
  #
  def Report.usage
    u  = sprintf(Behavior.usage_format, \
                 "message","Message to send through modem","String","None (required)")
    u += sprintf(Behavior.usage_format, \
                 "status_msg","Include status message?","true/false","true")
    u += "\n<Report name=\"Example\" message=\"Message from the deep\" "
    u += "status_msg=\"true\" "
    u += "comment=\"Send status and message\" />\n"
  end


  ##
  # Iterate over attributes in the element, extract parameters.
  #
  def load_attrs(p_behavior_element)
    super

    attrs = p_behavior_element.attributes
    attrs.keys.each do |k|
      case k.downcase
	when "message"
	@message = attrs[k].to_s

	when "status_msg"
	@status_msg = (attrs[k].to_s.downcase == "true")

	else
	puts("Unrecognized attr: #{k}")

      end
    end

  end


  ##
  # Override init.
  # Do some initialization steps
  #
  def init(p_seq_number=1)
    self.data_home = p_seq_number

    ##
    # If no message string was specified, send status
    #
    @status_msg = true unless (@message)

    @state = READY
  end

  ##
  # Override execute.
  #
  def execute
    if (@state == READY)
      @state = EXECUTING

      sleep(1.5)
      m = nil
      if (@status_msg)
        syslog("_ Getting status string")
        m = Supervisor.instance.make_status_string(@message)
      else
        syslog("_ Just sending message string")
        m = @message
      end
      Supervisor.instance.server.send_msg(m)


      @state = FINISHED
    else
      syslog("_ Not ready to execute. Run init first, maybe?")
    end
  end

end


##
# Standalone unit test (recommended)
#
if __FILE__ == $0
  if "usage" == ARGV[0]
    puts(Behavior.usage)
    puts(Report.usage)
    exit(0)
  end

  require 'rexml/document'
  require 'utils/misc'

  # Test code here
  # Typical subclassed behavior usage
  
  puts("Must test by using supervisor and test_report.xml")
end
