Rails.application.routes.draw do

  # require 'sidekiq/web'
  # mount Sidekiq::Web, at: '/sidekiq'

  concern :deletable do
    collection do
      get :deleted
    end
  end

  concern :followable do
    member do
      post 'follow', as: :follow, action: :follow
      delete 'follow', as: :unfollow, action: :unfollow
      put 'follow', as: :follow_toggle, action: :follow_toggle
    end
  end

  concern :taggable do
    member do
      post 'tagging', as: :tagging, action: :tagging
      delete 'tagging', as: :untagging, action: :untagging
    end
  end

  concern :subjectable do
    member do
      post 'subjects', as: :subjecting, action: :subjecting
      delete 'subjects', as: :unsubjecting, action: :unsubjecting
    end
  end

  concern :stageable do
    member do
      post 'educational_stages', as: :add_stages, action: :add_stages
      delete 'educational_stages', as: :remove_stages, action: :remove_stages
    end
  end

  concern :sociable do
    member do
      put 'like', as: :like, action: :like
    end
  end

  concern :downloadable do
    member do
      get 'download', as: :download, action: :download
    end
  end

  concern :reviewable do
    resources :reviews, only: [:index, :create, :update, :destroy], concerns: :deletable do
      member do
        post :rate
      end
    end
  end

  concern :submission do
    collection do
        get :submissions
    end
    member do
        post :submit
    end
  end

  concern :highlights do
    collection do
      get :this_week
      get :this_month
    end
  end

  # GET /users/1/learning_objects/
  concern :publisher do
    member do
      get 'drafts', as: :get_drafts, action: :show_all_drafts
      get 'learning_objects', as: :get_learning_objects, action: :show_all_learning_objects
      get 'learning_objects/liked', as: :get_liked_learning_objects, action: :show_liked_learning_objects
      get 'collections', as: :get_collections, action: :show_all_collections
      get 'collections/liked', as: :get_liked_collections, action: :show_liked_collections
    end
  end

  # GET /learning_objects/1/versions/123
  # GET /learning_objects/1/versions
  # POST /learning_objects/1/versions/234/checkout
  concern :versionable do
    resources :versions, only: [:show, :index] do
      member do
        post :checkout
      end
    end
  end

  scope :v1 do
    mount_devise_token_auth_for 'User', at: 'auth', controllers: {
      omniauth_callbacks: 'v1/omniauth_callbacks'
    }
  end

  namespace :v1 do
    resources :activities, only: :index
    resources :feed, only: [:index]

    resources :users, concerns: [:followable, :deletable, :publisher, :versionable] do
    resources :bookmarks, module: 'users', only: [:index, :create, :destroy]
      member do
        get 'following/:object_type', to: 'users#following'
        get 'followers', to: 'users#followers'
        get 'activities', to: 'activities#user_activities'
        get 'reviews/own', to: 'users#own_reviews'
        get 'reviews/received', to: 'users#received_reviews'
      end
    end

    resources :reviews, only: :show

    # search routes
    resources :search, only: :index do
      collection do
        get :autocomplete
      end
    end

    resources :collections, concerns: [:followable, :sociable, :downloadable, :reviewable, :taggable, :versionable, :deletable, :highlights, :subjectable, :stageable] do
      member do
        post :items, to: 'collections#add_object'
        delete :items, to: 'collections#delete_object'
      end
    end

    resources :learning_objects, concerns: [:sociable, :downloadable, :reviewable, :taggable, :versionable, :deletable, :highlights, :subjectable, :stageable, :submission] do
      member do
        resource :chunk, module: 'learning_objects', only: [:create, :show]
        resource :upload, module: 'learning_objects', only: :create
        resource :publish, module: 'learning_objects', only: :create
      end
      resources :attachment, module: 'learning_objects', only: :destroy, on: :member
    end

    resources :institutions, concerns: :deletable do
      member do
        get :users, to: 'institutions#users'
      end
    end

    resources :complaints, only: [:index, :create], concerns: :deletable
    resources :languages, except: [:new, :edit]
    resources :licenses, except: [:new, :edit]
    resources :mime_types, except: [:new, :edit]
    resources :object_types, except: [:new, :edit]
    resources :roles, except: [:new, :edit]
    resources :scores, only: [:index, :show, :update]
    resources :ratings, except: [:new, :edit]
    resources :contacts
    resources :suggestions
    resources :statistics, only: [:index]

    post '/package', to: 'packages#link'
    get '/subjects', to: 'subjects#index'
    get '/educational_stages', to: 'educational_stages#index'
    get '/activities/me', to: 'activities#me'
    get 'learning_objects/magnetlink/:magnetlink', to: 'learning_objects#magnetlink', as: 'magnetlink_learning_objects'
  end
end