# Used to get a list of the assets from the dependencies files.
class AssetFiles
  def initialize(component_name, component_paths)
    @component_paths = component_paths
    @assets = []
    @included_components = {}
    @components = []
    
    component('volt')
    component(component_name)
  end
  
  def load_dependencies(path)
    if path
      dependencies_file = File.join(path, "config/dependencies.rb")
    else
      raise "Unable to find component #{component_name.inspect}"
    end
    
    if File.exists?(dependencies_file)
      # Run the dependencies file in this asset files context
      code = File.read(dependencies_file)
      instance_eval(code)
    end
  end
  
  def component(name)
    unless @included_components[name]
      # Get the path to the component
      path = @component_paths.component_path(name)

      # Track that we added
      @included_components[name] = true

      # Load the dependencies
      load_dependencies(path)
      
      # Add any assets
      add_assets(path)
      @components << [path, name]
    end
  end
  
  def components
    @included_components.keys
  end
  
  def javascript_file(url)
    @assets << [:javascript_file, url]
  end

  def css_file(url)
    @assets << [:css_file, url]
  end
  
  def component_paths
    return @components
  end
  
  def add_assets(path)
    asset_folder = File.join(path, 'assets')
    if File.directory?(asset_folder)
      @assets << [:folder, asset_folder]
    end
  end
  
  
  def javascript_files(opal_files)
    javascript_files = []
    @assets.each do |type, path|
      case type
      when :folder
        javascript_files += Dir["#{path}/**/*.js"].map {|folder| '/assets' + folder[path.size..-1] }
      when :javascript_file
        javascript_files << path
      end
    end
    
    opal_js_files = []
    if Volt.source_maps?
      opal_js_files += opal_files.environment['volt/page/page'].to_a.map {|v| '/assets/' + v.logical_path + '?body=1' }
    else
      opal_js_files << '/assets/volt/page/page.js'
    end
    opal_js_files << '/components/home.js'

    javascript_files += opal_js_files
    
    return javascript_files
  end
  
  def css_files
    css_files = []
    @assets.each do |type, path|
      case type
      when :folder
        css_files += Dir["#{path}/**/*.{css,scss}"].map {|folder| '/assets' + folder[path.size..-1].gsub(/[.]scss$/, '') }
      when :css_file
        css_files << path
      end
    end
    
    return css_files
  end
  
end