# encoding: UTF-8
require 'mauve/server'
require 'mauve/configuration_builder'

module Mauve
  module ConfigurationBuilders

    class HTTPServer < ObjectBuilder
      is_attribute "port"
      is_attribute "ip"
      is_attribute "document_root"
      is_attribute "session_secret"
      is_attribute "base_url"

      def builder_setup
        @result = Mauve::HTTPServer.instance
      end
    end

    class UDPServer < ObjectBuilder
      is_attribute "port"
      is_attribute "ip"
      is_attribute "poll_every"
    
      def builder_setup
        @result = Mauve::UDPServer.instance
      end
    end

    class Processor < ObjectBuilder
      is_attribute "poll_every"
      is_attribute "transmission_cache_expire_time"

      def builder_setup
        @result = Mauve::Processor.instance
      end
    end

    class Timer < ObjectBuilder
      is_attribute "poll_every"

      def builder_setup
        @result = Mauve::Timer.instance
      end
    end

    class Notifier < ObjectBuilder
      is_attribute "poll_every"

      def builder_setup
        @result = Mauve::Notifier.instance
      end
    end
 
    class Heartbeat < ObjectBuilder
      is_attribute "destination"
      is_attribute "detail"
      is_attribute "summary"
      is_attribute "raise_after"
      is_attribute "send_every"
    
      def builder_setup
        @result = Mauve::Heartbeat.instance
      end
    end

    class Pop3Server < ObjectBuilder
      is_attribute "ip"
      is_attribute "port"

      def builder_setup
        @result = Mauve::Pop3Server.instance
      end
    end

    class Server < ObjectBuilder
      #
      # Set up second-level builders
      #
      is_builder "web_interface", HTTPServer
      is_builder "listener",      UDPServer
      is_builder "processor",     Processor
      is_builder "timer",         Timer
      is_builder "notifier",      Notifier
      is_builder "heartbeat",     Heartbeat
      is_builder "pop3_server",   Pop3Server

      is_attribute "hostname"
      is_attribute "database"
      is_attribute "initial_sleep"
   
      def builder_setup
        @result = Mauve::Server.instance
      end
    end
  end

  #
  # Add server to our top-level config builder
  #
  class ConfigurationBuilder < ObjectBuilder

    is_builder "server", ConfigurationBuilders::Server

    def created_server(server)
      raise BuildError.new("Only one 'server' clause can be specified") if @result.server
      @result.server = server
    end

  end

end