#
# this mixin represents the TeX specific methods of Traceable
#
#require 'ruby-debug' if not RUBY_PLATFORM=="i386-mingw32"
require 'treetop'
require File.dirname(__FILE__) + "/class.treetopHelper"
require File.dirname(__FILE__) + "/class.Traceable"
require File.dirname(__FILE__) + "/class.Traceable.md"

Treetop.load File.dirname(__FILE__) + "/mdTraceParser.treetop"


class TraceableSet


  def mk_hyperlink(id)
    idm = id.gsub("_","-")
    "[\[#{id}\]](#RT-#{idm})"
  end

  # this generates a synopsis of traces in markdown Format
  # @param [Symbol] selectedCategory the the category of the Traceables
  #                 which shall be reported.
  def reqtraceSynopsis(selectedCategory)
    all_traces(selectedCategory).
      sort_by{|x| trace_order_index(x.id) }.
    map{|t|
      tidm=t.id.gsub("_","-")

      lContributes = t.contributes_to.
          map { |c| mk_hyperlink(c) }

      luptraces = [uptrace_ids[t.id]].flatten.compact.map{|x| self[x]}

      luptraces=luptraces.
      sort_by{|x| trace_order_index(x.id)}.
      map{|u|
        "    - #{mk_hyperlink(u.id)} #{u.header_orig}"
      }

      ["- #{mk_hyperlink(t.id)} <!-- --> <a id=\"RT-#{tidm}\"/>**#{t.header_orig}**" +
       #                     "  (#{t.contributes_to.join(', ')})", "",
       "  (#{lContributes.join(', ')})", "",
       luptraces
       ].flatten.join("\n")
    }.join("\n\n")
  end


  # this generates the downstream_tracefile
  def to_downstream_tracefile(selectedCategory)
    all_traces(selectedCategory).
      sort_by{|x| trace_order_index(x.id) }.
    map{|t|
      "\n\n\\[#{t.id}\\] **#{t.header_orig}** { }()"
    }.join("\n\n")
  end

  #

  # This factory method processes all traces in a particular markdown file
  # and returns a TraceableSet
  #

  # @param  mdFile [String] name of the markdown File which shall be scanned

  #

  # @return [TraceableSet] The set of traceables found in the markdown file
  def self.processTracesInMdFile(mdFile)

    parser=TraceInMarkdownParser.new
    parser.consume_all_input = true

    raw_md_code_file=File.open(mdFile, "r:bom|utf-8")
    raw_md_code = raw_md_code_file.readlines.join
    raw_md_code_file.close
    #       print mdFile
    result = parser.parse(raw_md_code)
    #       print " ... parsed\n" todo: use logger here

    result_set = TraceableSet.new

    if result
      result.descendant.select{|x| x.getLabel==="trace"}.each{|c|
        id       = c.traceId.payload.text_value
        uptraces = c.uptraces.payload.text_value
        header   = c.traceHead.payload.text_value
        bodytext = c.traceBody.payload.text_value
        uptraces = c.uptraces.payload.text_value
        # Populate the Traceable entry
        theTrace = Traceable.new
        theTrace.info           = mdFile
        theTrace.id             = id
        theTrace.header_orig    = header
        theTrace.body_orig      = bodytext
        theTrace.trace_orig     = c.text_value
        theTrace.contributes_to = uptraces.gsub!(/\s*/, "").split(",")
        theTrace.category       = :SPECIFICATION_ITEM
        result_set.add(theTrace)
      }
      #            puts " .... finished"
    else
      puts ["","-----------", texFile, parser.failure_reason].join("\n")
    end
    result_set
  end


end