Rails.application.routes.draw do
  # Resources for testing
  resources :users, only: [:index] do
    member do
      get :expire
      get :accept
      get :edit_form
      put :update_form
    end

    authenticate do
      post :exhibit, on: :member
    end
  end

  resources :admins, only: [:index] do
    get :expire, on: :member
  end

  # Users scope
  devise_for :users

  as :user do
    get "/as/sign_in", to: "devise/sessions#new"
  end

  get "/sign_in", to: "devise/sessions#new"

  # Admin scope
  devise_for :admin, path: "admin_area", controllers: { sessions: "admins/sessions" }, skip: :passwords

  get "/admin_area/home", to: "admins#index", as: :admin_root
  get "/anywhere",        to: "foo#bar",      as: :new_admin_password

  authenticate(:admin) do
    get "/private", to: "home#private", as: :private
  end

  authenticate(:admin, lambda { |admin| admin.active? }) do
    get "/private/active", to: "home#private", as: :private_active
  end

  authenticated :admin do
    get "/dashboard", to: "home#admin_dashboard"
  end

  authenticated :admin, lambda { |admin| admin.active? } do
    get "/dashboard/active", to: "home#admin_dashboard"
  end

  authenticated do
    get "/dashboard", to: "home#user_dashboard"
  end

  unauthenticated do
    get "/join", to: "home#join"
  end

  # Routes for constraints testing
  devise_for :headquarters_admin, class_name: "Admin", path: "headquarters", constraints: { host: /192\.168\.1\.\d\d\d/ }

  constraints(host: /192\.168\.1\.\d\d\d/) do
    devise_for :homebase_admin, class_name: "Admin", path: "homebase"
  end

  devise_for :skip_admin, class_name: "Admin", skip: :all

  # Routes for format=false testing
  devise_for :htmlonly_admin, class_name:   "Admin",
                              skip:         [:confirmations, :unlocks],
                              path:         "htmlonly_admin",
                              format:       false,
                              skip_helpers: [:confirmations, :unlocks]

  devise_for :htmlonly_users, class_name:   "User",
                              only:         [:confirmations, :unlocks],
                              path:         "htmlonly_users",
                              format:       false,
                              skip_helpers: true

  # Other routes for routing_test.rb
  devise_for :reader, class_name: "User", only: :passwords

  scope host: "sub.example.com" do
    devise_for :sub_admin, class_name: "Admin"
  end

  namespace :publisher, path_names: { sign_in: "i_dont_care", sign_out: "get_out" } do
    devise_for :accounts, class_name: "Admin", path_names: { sign_in: "get_in" }
  end

  scope ":locale", module: :invalid do
    devise_for :accounts, singular: "manager", class_name: "Admin",
      path_names: {
        sign_in:      "login",
        sign_out:     "logout",
        password:     "secret",
        confirmation: "verification",
        unlock:       "unblock",
        sign_up:      "register",
        registration: "management",
        cancel:       "giveup"
      }, failure_app: lambda { |env| [404, { "Content-Type" => "text/plain" }, ["Oops, not found"]] },
      module: :devise
  end

  namespace :sign_out_via, module: "devise" do
    devise_for :deletes,          sign_out_via: :delete,          class_name: "Admin"
    devise_for :posts,            sign_out_via: :post,            class_name: "Admin"
    devise_for :delete_or_posts,  sign_out_via: [:delete, :post], class_name: "Admin"
  end

  get "/set",             to: "home#set"
  get "/unauthenticated", to: "home#unauthenticated"
  get "/custom_strategy/new"

  root to: "home#index", via: [:get, :post]
end
