namespace :server do
  
  desc "server:convert_file_tlds"
  task :convert_file_tlds do
    list = parse_list_tld
    File.open("lib/whois/definitions/tlds.txt", "w+") do |f| 
      f.write(list)
    end
    puts "Created file with #{list.size} servers."
  end

  desc "server:convert_file_ipv4"
  task :convert_file_ipv4 do
    list = parse_list_ipv4
    File.open("lib/whois/definitions/ipv4.txt", "w+") do |f|
      f.write(list)
    end
    puts "Created file with #{list.size} servers."
  end

  desc "server:convert_file_ipv6"
  task :convert_file_ipv6 do
    list = parse_list_ipv6
    File.open("lib/whois/definitions/ipv6.txt", "w+") do |f|
      f.write(list)
    end
    puts "Created file with #{list.size} servers."
  end


  def parse_list_tld
    File.readlines("data/tld_serv_list").map do |line|
      line.chomp!
      line.gsub!(/^\s*(.*)\s*$/, '\1')
      line.gsub!(/\s*#.*$/, '')
      next if line =~ /^$/;
      abort("format error #{line}") unless line =~ /^([\w\d\.-]+)\s+([\w\d\.:-]+|[A-Z]+\s+.*)$/

      extension, instructions = $1, $2
      server, options = case instructions
        when "NONE"             then [nil, { :adapter => Whois::Server::Adapters::None }]
        when "ARPA"             then [nil, { :adapter => Whois::Server::Adapters::Arpa }]
        when /^WEB (.*)$/       then [nil, { :adapter => Whois::Server::Adapters::Web, :web => $1 }]
        when "CRSNIC"           then ["whois.crsnic.net", { :adapter => Whois::Server::Adapters::Verisign }]
        when /^VERISIGN (.*)$/  then [$1, { :adapter => Whois::Server::Adapters::Verisign }]
        when "PIR"              then ["whois.publicinterestregistry.net", { :adapter => Whois::Server::Adapters::Pir }]
        when "AFILIAS"          then ["whois.afilias-grs.info", { :adapter => Whois::Server::Adapters::Afilias }]
        when "NICCC"            then ["whois.nic.cc", { :adapter => Whois::Server::Adapters::Verisign }]
        else                    [instructions]
      end

      <<-RUBY
Whois::Server.define :tld, #{extension.inspect}, \
#{server.inspect}\
#{options.nil? ? "" : ", " + options.inspect}
      RUBY
    end
  end

  def parse_list_ipv4
    File.readlines("data/ip_del_list").map do |line|
      line.chomp!
      line.gsub!(/^\s*(.*)\s*$/, '\1')
      line.gsub!(/\s*#.*$/, '')
      next if line =~ /^$/;
      abort("format error #{line}") unless line =~ /^([\d\.]+)\/(\d+)\s+([\w\.]+)$/

      range, server = line.split(/[ \t]/)
      server, options = case server
        when /\./           then [server]
        when "UNALLOCATED"  then [nil, { :adapter => Whois::Server::Adapters::None }]
        else                     ["whois.#{server}.net"]
      end

      <<-RUBY
Whois::Server.define :ipv4, #{range.inspect}, \
#{server.inspect}\
#{options.nil? ? "" : ", " + options.inspect}
      RUBY
    end
  end

  def parse_list_ipv6
    File.readlines("data/ip6_del_list").map do |line|
      line.chomp!
      line.gsub!(/^\s*(.*)\s*$/, '\1')
      line.gsub!(/\s*#.*$/, '')
      next if line =~ /^$/;
      abort("format error #{line}") unless line =~ %r{^([\da-fA-F]{4}):([\da-fA-F]{1,4})::/(\d+)\s+([\w\.]+)$}

      range  = "#{$1}:#{$2}::/#{$3}"
      server = $4
      server, options = case server
        when /\./           then [server]
        when "UNALLOCATED"  then [nil, { :adapter => Whois::Server::Adapters::None }]
        when "6to4"         then ["6to4", { :adapter => Whois::Server::Adapters::NotImplemented }]
        when "teredo"       then ["teredo", { :adapter => Whois::Server::Adapters::NotImplemented }]
        else                     ["whois.#{server}.net"]
      end

      <<-RUBY
Whois::Server.define :ipv6, #{range.inspect}, \
#{server.inspect}\
#{options.nil? ? "" : ", " + options.inspect}
      RUBY
    end
  end

end