=begin

CapicuaGen

CapicuaGen es un software que ayuda a la creación automática de
sistemas empresariales a través de la definición y ensamblado de
diversos generadores de características.

El proyecto fue iniciado por José Luis Bautista Martin, el 6 de enero
del 2016.

Puede modificar y distribuir este software, según le plazca, y usarlo
para cualquier fin ya sea comercial, personal, educativo, o de cualquier
índole, siempre y cuando incluya este mensaje, y se permita acceso el
código fuente.

Este software es código libre, y se licencia bajo LGPL.

Para más información consultar http://www.gnu.org/licenses/lgpl.html
=end

require 'active_support/core_ext/object/blank'
require 'optparse'
require 'optparse/time'
require 'ostruct'
require 'pp'

require_relative 'Mixins/reflection_mixin'


module CapicuaGen

  class Generator
    include CapicuaGen

    # Parsea un linea de comamdos
    def parse_command_line(args)

      options = OpenStruct.new

      options.ignore_features=[]

      opt_parser = OptionParser.new do |opts|
        opts.banner = "Uso: <Script generador> [comandos] [opciones]"

        opts.separator ""
        subtext = <<HELP
Comandos:
   generate          :     Genera las caracteriticas configuradas.
   clean             :     Limpia los archivos generados.
   cleanAndGenerate  :     Limpia los archivos generados y luego los vuelve a crear.
   example           :     Genera un ejemplo


Ejecute 'opt.rb COMMAND --help' para obtener mas
HELP
        opts.separator ""
        opts.separator subtext
        opts.separator ""

        # No argument, shows at tail.  This will print an options summary.
        # Try it and see!
        opts.on_tail("-h", "--help", "Muestra este mensaje") do
          puts opts
          options.help=true
          options.exit=true
        end

        # Another typical switch to print the version.
        opts.on_tail("--version", "Muestra la versión") do
          puts ::Version.join('.')
          options.version=true
          options.exit   =true
        end

      end

      subcommands = {

          'generate'         => OptionParser.new do |opts|

            opts.banner = "Uso: generate [options]"
            opts.separator ""

            # List of arguments.
            opts.on("--ignore featurename1, featurename2, featurename2", Array, "Lista de caracteristicas que sera omitidas") do |ignore_features|
              options.ignore_features = ignore_features
            end

            opts.on("-f", "--force", "Fuerza que se sobreescriban las carateristicas generadas") do
              options.force= true
            end

            opts.on_tail("-h", "--help", "Muestra este mensaje") do
              puts opts
              options.help=true
              options.exit=true
            end
          end,


          'clean'            => OptionParser.new do |opts|

            opts.banner = "Uso: clean [options]"
            opts.separator ""

            # List of arguments.
            opts.on("--ignore featurename1, featurename2, featurename2", Array, "Lista de caracteristicas que sera omitidas") do |ignore_features|
              options.ignore_features = ignore_features
            end

            opts.on_tail("-h", "--help", "Muestra este mensaje") do
              puts opts
              options.help=true
              options.exit=true
            end
          end,


          'cleanAndGenerate' => OptionParser.new do |opts|
            opts.banner = "Uso: example [options]"
            opts.separator ""
            opts.separator "Opciones:"
            opts.separator ""

            # List of arguments.
            opts.on("--ignore featurename1, featurename2, featurename2", Array, "Lista de caracteristicas que sera omitidas") do |ignore_features|
              options.ignore_features = ignore_features
            end

            opts.on("-f", "--force", "Fuerza que se sobreescriban las carateristicas generadas") do
              options.force= true
            end

            opts.on_tail("-h", "--help", "Muestra este mensaje") do
              puts opts
              options.help=true
              options.exit=true
            end

            opts.separator ""
          end,


          'example'          => OptionParser.new do |opts|
            opts.banner = "Uso: cleanAndGenerate [options]"
            opts.separator ""
            opts.separator "Opciones:"
            opts.separator ""

            # List of arguments.
            opts.on("-o", "--out directorio", "") do |directorio|
              options.out = directorio
            end

            opts.on_tail("-h", "--help", "Muestra este mensaje") do
              puts opts
              options.help=true
              options.exit=true
            end

            opts.separator ""
          end

      }


      begin
        internal_args=args.clone
        opt_parser.order!(internal_args)
        command = internal_args.shift

        if command

          case command

            when 'generate'
              options.generate=true

            when 'clean'
              options.clean   =true
              options.generate=false

            when 'cleanAndGenerate'
              options.clean   =true
              options.generate=true

            when 'example'
              options.clean   =false
              options.generate=false
              options.example =true
              options.out     ='.'

          end

          subcommands[command].order! internal_args


        else
          options.generate=true
        end

      rescue => e
        $stderr.puts e
        puts
        puts opt_parser
        puts
        options.exit=true
      end


      return options
    end

  end
end