=begin rdoc
call_rake4latex.rb offers an easy and fast interface
to rake4latex.

Just call it from the shell:
  call_rake4latex.rb my_file

my_file.tex will be compiled to my_file.pdf.

For details, please use the help:
  call_rake4latex.rb -h

For complex documents you may want define your own rakefile
and use rake.

It is recommended to copy this file to a location in your 
search path for executable files.
=end

require 'rake4latex'
#~ Dir.chdir('lib'){ require 'rake4latex' }
require 'optparse'

#Anlegen des Parsers
opts = OptionParser.new()
opts.banner = "Usage: call_rake4latex.rb [options] filename"	#Usage-zeile
opts.separator "Call LaTeX as often as needed."
opts.separator ""
opts.separator "Examples:"
opts.separator "call_rake4latex testdocument.pdf"
opts.separator "  Create testdocument.pdf via pdflatex"
opts.separator "  Starts only if testdocument.tex is newer then testdocument.pdf."
opts.separator ""
opts.separator "call_rake4latex -e testdocument"
opts.separator "  Touch 'testdocument.tex' (set the modification date)"
opts.separator "  Create testdocument.pdf via pdflatex"
opts.separator ""
opts.separator "Specific options:"

#
#List of task to be done after the TeX-call.
#
TASK_BEFORE_TeX = []  #only task where we need the filenem
TASK_AFTER_TeX = []
PARSE_MESSAGES = true


#
#fixme: format
=begin
Shortcuts
=end
opts.on('-e', "--enforce", "Enforce an initial TeX-run") { |v|
  TASK_BEFORE_TeX << :enforce
}

opts.on('-f', "--format FORMAT", "Set the format for TeX-run (pdflatex, xelatex, lualatex)") { |v|
  Rake4LaTeX::DEFAULT_SETTINGS[:program] = v.to_sym
}

#
#fixme:
#Warum gibt es immer einen TeX-Lauf mit dieser Option?
#
opts.on('--dep', "--dependecies", "Build dependecies (rakefile recommended)") { |v|
  TASK_BEFORE_TeX << :dependecies
}
opts.on("-i", "--ignore", "--ignore-error", "Allow LaTeX errors") { |v|
  puts "Allow LaTeX errors"  if PARSE_MESSAGES
    Rake4LaTeX::DEFAULT_SETTINGS[:texerrors_allowed] = true
}
opts.on("-s", "--statistic", "Show the statistic after TeX-run") { |v|
  puts "Show the statistic after TeX-run"  if PARSE_MESSAGES
  TASK_BEFORE_TeX  << :statistic  #Set filename
  TASK_AFTER_TeX  << :statistic
}
opts.on("-o", "--overview", "Create a log-overview file") { |v|
  puts "Create a log-overview file after TeX-run"  if PARSE_MESSAGES
  TASK_BEFORE_TeX  << :statistic  #Set filename
  TASK_AFTER_TeX  << :log_overview_file
}
opts.on("-c", "--clean", "Clean after TeX-run (delete auxiliary files)") { |v|
  puts "Clean after TeX-run"  if PARSE_MESSAGES
  TASK_AFTER_TeX  << :clean
}

=begin
Main options
=end
# Soll der Parameter Optional sein, kann [] verwendet werden.
opts.on("--touch FILE", "Touch FILE") { |v|
  puts "Touch #{v.inspect}" if PARSE_MESSAGES
  task :touch => v
  task :default => :touch
}


#
opts.on("--task TASK", "Define a rake-task") { |v|
  puts "Set task #{v.inspect}" if PARSE_MESSAGES
  task :default => v
}

#
opts.on("--task_after TASK", "Define a rake-task after the TeX-run") { |v|
  puts "Set task #{v.inspect} after LaTeX" if PARSE_MESSAGES
  TASK_AFTER_TeX  << v
}

=begin
LaTeXRunner-options
=end
#
opts.on("--maxrun MAXRUN", "Maximum MAXRUN TeX calls") { |v|
  puts "Set maximum TeX-Runs #{v.inspect}"  if PARSE_MESSAGES
    Rake4LaTeX::DEFAULT_SETTINGS[:maxruns] = v.to_i
}

opts.on("-l", "--loglevel LEVEL", "Log Level for the logger (1=debug, 2=info(default), 3=warn 4=error)") { |v|
  puts "Set loglevel to #{v.inspect}"  if PARSE_MESSAGES
  Rake4LaTeX::DEFAULT_SETTINGS[:loglevel] = v.to_i
}

opts.on("-v", "--version", "Version") { |v|
  puts "Rake4LaTeX-Caller Version #{Rake4LaTeX::VERSION}" 
}

task :default #empty dummy task

#Parsen der Parameter mit Exception bei ungültigen Parametern
begin
	opts.parse!
  ARGV.each{|arg|
    target = arg.ext('pdf')
    puts "Define target #{target}"
    TASK_BEFORE_TeX.each{|task|
    case task
      when :enforce
        puts "Force an initial TeX-run (touch #{target.ext('tex')})" if PARSE_MESSAGES
        task (:touch => target.ext('tex'))
        task (:default => :touch)
      when :dependecies
        puts "Build dependecies for #{target.ext('tex')}" if PARSE_MESSAGES
        TeXfile.new(target.ext('tex')).includes(:recursive, :uniq).each{|dep|
          puts "     => #{dep.inspect}" if PARSE_MESSAGES
          task (target => dep)
        }
      when :statistic
        task (:statistic => target.ext('tex'))
      when :log_overview_file
        task (:log_overview_file => target.ext('tex'))
      else
        raise ArgumentError, "Undefined option #{task.inspect}"
      end
    }
    task( :default => target )
    puts "call_rake4latex tries to generate #{target}"
  }  
rescue OptionParser::MissingArgument, OptionParser::InvalidOption => err
	puts "Error:\t#{err}"
	#Ausgabe der Schnittstelle
	puts opts
end

#
#Set tasks after the LaTeX-call
TASK_AFTER_TeX.each{|task|
  task (:default => task)
}

app = Rake.application
app[:default].invoke

if $0 == __FILE__
  if STDIN.tty?
    puts "Finished, please enter any key"
    STDOUT.flush
    STDIN.getc 
  end
end