# -*- encoding: utf-8 -*-

require 'albacore/application'
require 'albacore/logging'
require 'albacore/fsharp_project'
require 'albacore/csharp_project'
require 'albacore/vb_project'

# The albacore module instance methods.
module Albacore
  class << self
    # Accessor for the Albacore application. Configuration
    # and similar singleton values will be stored in this
    # instance. Multiple calls will yield the same instance.
    def application
      @application ||= Albacore::Application.new
    end

    # Name of default Rakefile, used by Cli
    def rakefile
      'Rakefile'
    end

    # Name of the default Gemfile, used by Cli
    def gemfile
      'Gemfile'
    end

    # Name of the default .semver file, used by Cli
    def semver_file
      '.semver'
    end

    # set the application -- good for testing
    # the infrastructure of albacore by resetting the
    # state after each test
    def set_application app
      @application = app
    end

    # Defines a new task with all of what that entails:
    # will call application.define_task.
    def define_task *args, &block
      args = [caller[0][/`.*'/][1..-2]] if args.nil? or args.empty?
      # delegate to the application singleton
      application.define_task *args, &block
    end

    # Set the global albacore logging level.
    def log_level= level
      application.logger.level = level
    end

    # Use to write to STDOUT (by default)
    def puts *args
      application.puts *args
    end

    def events
      @events ||= {}
    end

    def subscribe event, &block
      event = event.to_sym unless event.is_a? Symbol
      events[event] ||= Set.new
      events[event].add block
    end

    def publish event, obj
      if events.member? event
        events[event].each { |m| m.call(obj) }
      end
    end

    # Gets whether we're running under Windows.
    #
    def windows?
      !!::Rake::Win32.windows?
    end

    def create_project(project)
      path=if project.is_a? String
             Pathname.new(project)
           else
             project
           end
      case path.extname
        when ".fsproj"
          FsharpProject.new(path)
        when ".csproj"
          CsharpProject.new(path)
        when ".vbproj"
          VbProject.new(path)
      end
    end
    Albacore.log_level = Logger::DEBUG if ENV["DEBUG"]
  end
end
