require "yaml"

module Invoker
  module Power
    # Save and Load Invoker::Power config
    class ConfigExists < StandardError; end

    class Config
      def self.has_config?
        File.exist?(config_file)
      end

      def self.create(options = {})
        if has_config?
          raise ConfigExists, "Config file already exists at location #{config_file}"
        end
        config = new(options)
        config.save
      end

      def self.delete
        if File.exist?(config_file)
          File.delete(config_file)
        end
      end

      def self.config_file
        File.join(Invoker.home, ".invoker", "config")
      end

      def self.config_dir
        File.join(Invoker.home, ".invoker")
      end

      def initialize(options = {})
        @config = options
      end

      def self.load_config
        config_hash = File.open(config_file, "r") { |fl| YAML.load(fl) }
        new(config_hash)
      end

      def dns_port=(dns_port)
        @config[:dns_port] = dns_port
      end

      def http_port=(http_port)
        @config[:http_port] = http_port
      end

      def https_port=(https_port)
        @config[:https_port] = https_port
      end

      def ipfw_rule_number=(ipfw_rule_number)
        @config[:ipfw_rule_number] = ipfw_rule_number
      end

      def dns_port; @config[:dns_port]; end
      def http_port; @config[:http_port]; end
      def ipfw_rule_number; @config[:ipfw_rule_number]; end
      def https_port; @config[:https_port]; end

      def tld
        @config[:tld] || Invoker.default_tld
      end

      def save
        File.open(self.class.config_file, "w") do |fl|
          YAML.dump(@config, fl)
        end
        self
      end
    end
  end
end
