class Noah::App
  # Application URIs
  get '/applications/:appname/configurations/:config/?' do |appname, config|
    app = Noah::Application.find(:name => appname).first
    (halt 404) if app.nil?
    request.path_info = "/configurations/#{config}"
    pass
  end

  get '/applications/:appname/?' do |appname|
    app = Noah::Application.find(:name => appname).first
    (halt 404) if app.nil?
    app.to_json
  end

  put '/applications/:appname/watch' do |appname|
    required_params = ["endpoint"]
    data = JSON.parse(request.body.read)
    (data.keys.sort == required_params.sort) ? (a = Noah::Application.find(:name => appname).first) : (raise "Missing Parameters")
    a.nil? ? (halt 404) : (w = a.watch!(:endpoint => data['endpoint']))
    w.to_json
  end

  put '/applications/:appname/link' do |appname|
    required_params = ["link_name"]
    data = JSON.parse(request.body.read)
    (data.keys.sort == required_params.sort) ? (a = Noah::Application.find(:name => appname).first) : (raise "Missing Parameters")
    a.nil? ? (halt 404) : (a.link! data["link_name"])
    a.to_json
  end

  put '/applications/:appname/configurations/:configname/?' do |appname, configname|
    required_params = ["format", "body"]
    raise "Missing Parameters" if request.body.nil?
    data = JSON.parse(request.body.read)
    raise "Missing Parameters" if data.keys.sort != required_params.sort
    add_config_to_app(appname, {:name => configname, :format => data['format'], :body => data['body']})
  end

  put '/applications/:appname/?' do |appname|
    required_params = ["name"]
    data = JSON.parse(request.body.read)
    if data.keys.sort == required_params.sort && data['name'] == appname
      app = Noah::Application.find_or_create(:name => appname)
    else
      raise "Missing Parameters"
    end  
    if app.valid?
      action = app.is_new? ? "create" : "update"
      app.save
      r = {"result" => "success","id" => app.id, "action" => action, "name" => app.name }
      r.to_json
    else
      raise "#{format_errors(app)}"
    end
  end

  delete '/applications/:appname/?' do |appname|
    app = Noah::Application.find(:name => appname).first
    (halt 404) if app.nil?
    app.delete
    r = {"result" => "success", "action" => "delete", "id" => "#{app.id}", "name" => "#{appname}"}
    r.to_json
  end

  delete '/applications/:appname/configurations/:configname/?' do |appname, configname|
    app = Noah::Application.find(:name => appname).first
    (halt 404) if app.nil?
    config = Noah::Configuration.find(:name => configname).first
    (halt 404) if config.nil?
    if app.configurations.member?(config)
      app.configurations.delete(config)
      r = {"result" => "success", "action" => "delete", "id" => "#{app.id}", "name" => "#{app.name}", "configuration" => "#{config.name}"}
      r.to_json
    else
      halt 404
    end
  end

  get '/applications/?' do
    apps = Noah::Applications.all
    (halt 404) if apps.size == 0
    apps.to_json
  end
end