module Fog
  module Parsers
    module AWS
      module EMR

        class DescribeJobFlows < Fog::Parsers::Base

          def reset
            @context = []
            @contexts = ['BootstrapActions', 'ExecutionStatusDetail', 'Instances', 'Steps', 'InstanceGroups', 'Args']
            
            @response = { 'JobFlows' => [] }
            @bootstrap_actions = {'ScriptBootstrapActionConfig' => {'Args' => []}}
            @instance = { 'InstanceGroups' => [], 'Placement' => {}}
            @step = {
              'ExecutionStatusDetail' => {}, 
              'StepConfig' => {
                'HadoopJarStepConfig' =>  {
                  'Args' => [],
                  'Properties' => []
                }
              }
            }
            @flow = {'Instances' => [], 'ExecutionStatusDetail' => {}, 'BootstrapActions' => [], 'Steps' => []}
            @instance_group_detail = {}
            @execution_status_detail = {}
          end

          def start_element(name, attrs = [])
            super
            if @contexts.include?(name)
              @context.push(name)
            end
          end

          def end_element(name)
            if @context.last == 'BootstrapActions'
              case name
              when 'Name'
                @bootstrap_actions[name] = value
              when 'Path'
                @bootstrap_actions['ScriptBootstrapActionConfig'][name] = value
              when 'BootstrapActions'
                @flow['BootstrapActions'] = @bootstrap_actions
                @bootstrap_actions = {'ScriptBootstrapActionConfig' => {'Args' => []}}
              end
            end
            
            if @context.last == 'ExecutionStatusDetail'
              case name
              when 'CreationDateTime', 'EndDateTime', 'LastStateChangeReason', 
                  'ReadyDateTime', 'StartDateTime', 'State'
                @execution_status_detail[name] = value             
              when 'ExecutionStatusDetail'
                if @context.include?('Steps')
                  @step['ExecutionStatusDetail'] = @execution_status_detail
                else
                  @flow['ExecutionStatusDetail'] = @execution_status_detail
                end
                @execution_status_detail = {}
              end
            end
            
            if @context.last == 'Instances'
              case name
              when 'AvailabilityZone'
                @instance['Placement'][name] = value
              when 'Ec2KeyName', 'HadoopVersion', 'InstanceCount', 'KeepJobFlowAliveWhenNoSteps',
                    'MasterInstanceId', 'MasterInstanceType', 'MasterPublicDnsName', 'NormalizedInstanceHours',
                    'SlaveInstanceType', 'TerminationProtected'
                @instance[name] = value
              when 'member'
                @instance['InstanceGroups'] << @instance_group_detail
                @instance_group_detail = {}      
              when 'Instances'
                @flow['Instances'] = @instance
                @instance = { 'InstanceGroups' => [], 'Placement' => {}}
              end
            end
            
            if @context.last == 'InstanceGroups'
              case name
              when 'member'
                @instance['InstanceGroups'] << @instance_group_detail
                @instance_group_detail = {}
              else
                @instance_group_detail[name] = value
              end
            end
            
            if @context.last == 'Args'
              if name == 'member'
                if @context.include?('Steps')
                  @step['StepConfig']['HadoopJarStepConfig']['Args'] << value.strip
                else
                  @bootstrap_actions['ScriptBootstrapActionConfig']['Args'] << value
                end
              end
            end
            
            if @context.last == 'Steps'
              case name
              when 'ActionOnFailure', 'Name'
                @step[name] = value
              when 'Jar', 'MainClass'
                @step['StepConfig']['HadoopJarStepConfig'][name] = value
              when 'member'
                @flow['Steps'] << @step
                @step = {
                  'ExecutionStatusDetail' => {}, 
                  'StepConfig' => {
                    'HadoopJarStepConfig' =>  {
                      'Args' => [],
                      'Properties' => []
                    }
                  }
                }
              end
            end
            
            if @context.empty?
              case name
              when 'AmiVersion', 'JobFlowId', 'LogUri', 'Name'
                @flow[name] = value
              when 'member'
                @response['JobFlows'] << @flow
                @flow = {'Instances' => [], 'ExecutionStatusDetail' => {}, 'BootstrapActions' => [], 'Steps' => []}
              end
            end
            
            if @context.last == name
              @context.pop
            end
          end
        end

      end
    end
  end
end
