require 'sidekiq/web'

Rails.application.routes.draw do
  devise_for :users, controllers: { confirmations: 'users/confirmations' }

  get 'welcome', to: 'welcome#index'
  get 'check_your_email', to: 'welcome#check_your_email'

  get 'signup', to: 'signup#index'
  match 'signup/:step', to: 'signup#steps', as: :signup_steps, via: [:get, :post]
  post 'signup_validate', to: 'signup#validate'

  namespace :contributions do
    root to: 'donations#index'
    get 'projects', to: 'projects#index'
    resources :donations, only: ['index']
  end

  resources :invitations, only: ['index', 'show', 'create', 'destroy']

  namespace :services do
    resource :chat, only: [:show], controller: 'chat'

    resource :mastodon, only: [:show], controller: 'mastodon'

    resource :email, only: [:show], controller: 'email' do
      member do
        get 'new_password'
      end
    end

    resources :lightning, only: [:index] do
      collection do
        get 'transactions'
        get 'qr_lnurlp'
      end
    end

    resource :storage, controller: 'remotestorage', only: [:show] do
      resources :rs_auths, only: [:destroy] do
        member do
          get :revoke, to: 'rs_auths#destroy'
          get :launch_app
        end
      end
    end
  end

  resources :settings, param: 'section', only: ['index', 'show', 'update'] do
    collection do
      post 'update_email'
      post 'reset_password'
      post 'reset_email_password'
      post 'set_nostr_pubkey'
      delete 'nostr_pubkey', to: 'settings#remove_nostr_pubkey'
    end
  end

  get '.well-known/webfinger', to: 'webfinger#show'
  get '.well-known/nostr', to: 'well_known#nostr'
  get '.well-known/lnurlp/:username', to: 'lnurlpay#index', as: 'lightning_address'
  get '.well-known/keysend/:username', to: 'lnurlpay#keysend', as: 'lightning_address_keysend'

  get 'lnurlpay/:username/invoice', to: 'lnurlpay#invoice', as: 'lnurlpay_invoice'

  post 'webhooks/lndhub', to: 'webhooks#lndhub'

  namespace :api do
    get 'btcpay/onchain_btc_balance', to: 'btcpay#onchain_btc_balance'
    get 'btcpay/lightning_btc_balance', to: 'btcpay#lightning_btc_balance'
  end

  namespace :admin do
    root to: 'dashboard#index'

    resources 'users', param: 'address', only: ['index', 'show'], constraints: { address: /.*/ }
    get 'invitations', to: 'invitations#index'
    resources :donations
    get 'lightning', to: 'lightning#index'

    namespace :app_catalog do
      resources 'web_apps', only: ['index']
    end

    namespace :settings do
      resources 'registrations', only: ['index', 'create']
      resources 'services', only: ['index', 'create']
    end
  end

  namespace :rs do
    resource :oauth, only: [:new, :create], path_names: {
      new: ':username', create: ':username'
    }, controller: 'oauth'
  end

  namespace :discourse do
    get "connect", to: 'sso#connect'
  end

  authenticate :user, ->(user) { user.is_admin? } do
    mount Sidekiq::Web, at: '/sidekiq'
    mount Flipper::UI.app(Flipper), at: '/flipper'
  end

  # Letter Opener (open "sent" emails in dev and staging)
  if Rails.env.match(/staging|development/)
    mount LetterOpenerWeb::Engine, at: '/letter_opener'
  end

  root to: 'dashboard#index'

  direct :s3_image do |blob|
    File.join(ENV['S3_ALIAS_HOST'], blob.key)
  end
end
