# encoding: utf-8
require 'rails/generators'

module BackboneGenerator
  class ModelGenerator < ::Rails::Generators::Base
    source_root File.expand_path('../templates', __FILE__)
    desc "Creates a BackboneModel, Jasmine tests/factory"
    argument :raw_model_name, required: true, type: 'string'

    def create_model
      destination_dir = File.join( ['app/assets/javascripts', namespace, "models/#{model_name}.coffee"].compact )
      template 'app/assets/javascripts/%namespace%/models/%model_name%.coffee.tt', destination_dir
    end

    def create_specs
      destination_dir = File.join( ['spec/javascripts', namespace].compact )
      spec_paths = ['factories/%model_name%_factory.coffee', 'models/%model_name%_spec.coffee']
      spec_paths.each do |path|
        template "spec/javascripts/%namespace%/#{path}.tt", "spec/javascripts/%namespace%/#{path}"
      end
    end

    def print_tree
      tree =  <<-TREE

        app/assets/javascripts/dashboard
        └── models
            └── widget.coffee

        spec/javascripts/dashboard
        ├── factories
        │   └── widget_factory.coffee
        └── models
            └── widget_spec.coffee
      TREE
      say tree.gsub(/\/dashboard/, (namespace && "/#{namespace}").to_s).gsub(/widget/, model_name)
    end

    # Helpers
    def namespace(classify=false)
      style      = classify ?  :camelize : :underscore
      join_style = classify ? '.' : '/'
      
      _namespaces = raw_model_name.split('::')
      @model_name = _namespaces.pop
      unless _namespaces.empty?
         _namespaces = _namespaces.map {|ns| ns.singularize.send(style)}
         @namespace = _namespaces.join(join_style)
      end
    end
    
    # def namespace(classify=false)
    #   style      = classify ?  :camelize : :underscore
    #   join_style = classify ? '.' : '/'
    #
    #   _namespaces = raw_collection_name.split('::')
    #   _collection_name = _namespaces.pop
    #   unless _namespaces.empty?
    #     _namespaces = _namespaces.map {|ns| ns.singularize.send(style)}
    #   end
    #   _namespaces.join(join_style)
    # end

    def model_name(classify=false)
      @model_name, @namespace = raw_model_name.split('::').reverse
      style = classify ?  :camelize : :underscore
      @model_name.singularize.send(style)
    end

    def collection_name(classify=false)
    end

  end
end