#!/usr/bin/env ruby

require 'i18n'
require 'json'
require 'tempfile'
require 'thor'
require 'thor/group'
require 'yaml'

require File.join(File.dirname(__FILE__),
                  '../lib/SaudeiD/SaudeiD_helper')
require_relative '../lib/SaudeiD/version.rb'

module GeneCapybara
  class Generate < Thor
    include Thor::Actions

    desc 'feature [RESOURCE_NAME]', 'Generates a feature'
    option :lang,
    banner: 'any of the gherkin support languages',
    default: :pt
    def feature(name)
      I18n.config.default_locale = options[:lang]
      in_root_project_folder?
      create_feature_file(name)
    end

    desc 'step [RESOURCE_NAME]', 'Generates a step'
    option :lang,
           banner: 'any of the gherkin supported languages',
           default: :pt
    def step(name)
      I18n.config.default_locale = options[:lang]
      in_root_project_folder?
      create_steps_file name
    end

    desc 'page [RESOURCE_NAME]', 'Generates pages'
    option :lang,
           banner: 'any of the gherkin supported languages',
           default: :pt
    def page(name)
      I18n.config.default_locale = options[:lang]
      in_root_project_folder?
      create_page_file name
    end

    desc 'services [RESOURCE_NAME]', 'Generates services'
    option :lang,
           banner: 'any of the gherkin supported languages',
           default: :pt
    def service(name)
      I18n.config.default_locale = options[:lang]
      in_root_project_folder?
      create_service_file name
    end

    desc 'all_web [RESOURCE_NAME]', 'Generates features, steps and pages'
    option :lang,
           banner: 'any of the gherkin supported languages',
           default: :pt
    def all_web(name)
      I18n.config.default_locale = options[:lang]
      in_root_project_folder?
      create_feature_file name
      create_steps_file name
      create_page_file name
    end

    desc 'all_api [RESOURCE_NAME]', 'Generates feature and steps'
    option :lang,
           banner: 'any of the gherkin supported languages',
           default: :pt
    def all_api(name)
      I18n.config.default_locale = options[:lang]
      in_root_project_folder?
      create_feature_file name
      create_steps_file name
      create_service_file name
    end

    def self.source_root
      File.join(File.dirname(__FILE__), '../lib/templates')
    end
  end
end

module GeneCapybara
  class GeneCapybaraRunner < Thor
    include Thor::Actions

    map %w[-v --version] => :version

    default_task :help

    register GeneCapybara::Generate, 'generate',
             'generate [GENERATOR] [RESOURCE_NAME]',
             'Generates various resources'
    register GeneCapybara::Generate, 'g',
             'g [GENERATOR] [RESOURCE_NAME]',
             'Generates various resources'

    desc 'new web PROJECT_NAME',
         'Generates the structure of a new project that uses '\
         'Capybara, Selenium and Cucumber'
    option :lang,
            banner: 'any of the gherkin supported languages',
            default: :pt
    def new_web(name)
      I18n.config.default_locale = options[:lang]
      directory File.join(File.dirname(__FILE__),
                          '../lib/SkeletonWeb'), name
    end
    
    desc 'new api PROJECT_NAME',
          'Generates the structure of api'
    option :lang,
            banner: 'any of the gherkin supported languages',
            default: :pt
    def new_api(name)
      I18n.config.default_locale = options[:lang]
      directory File.join(File.dirname(__FILE__),
                          '../lib/SkeletonApi'), name
    end

    desc 'version', 'Shows the gem version'
    def version
      puts "GeneCapybara Version #{SaudeiD::VERSION}"
    end

    def self.source_root
      File.join(File.dirname(__FILE__), '../lib/templates')
    end

    def initialize(*args)
      super
      locales_folder_path = File.join(File.dirname(__FILE__),
                                      '../lib/locales')
      I18n.load_path = Dir[File.join(locales_folder_path, '*.yml')]
      I18n.backend.load_translations
      I18n.config.enforce_available_locales = true
    end
  end
end

GeneCapybara::GeneCapybaraRunner.start