defmodule Shift73kWeb.Router do
  use Shift73kWeb, :router
  import Shift73kWeb.UserAuth
  alias Shift73kWeb.EnsureRolePlug
  alias Shift73kWeb.EnsureUserExistPlug
  alias Shift73kWeb.EnsureAllowRegistrationPlug

  pipeline :browser do
    plug :accepts, ["html"]
    plug :fetch_session
    plug :fetch_live_flash
    plug :put_root_layout, {Shift73kWeb.LayoutView, :root}
    plug :protect_from_forgery
    plug :put_secure_browser_headers
    plug :fetch_current_user
  end

  pipeline :ensure_role_user do
    plug EnsureRolePlug, [:admin, :manager, :user]
  end

  pipeline :ensure_user_exist do
    plug EnsureUserExistPlug
  end

  pipeline :ensure_allow_registration do
    plug EnsureAllowRegistrationPlug
  end

  pipeline :ensure_role_manager do
    plug EnsureRolePlug, [:admin, :manager]
  end

  pipeline :ensure_role_admin do
    plug EnsureRolePlug, :admin
  end

  # Enables the Swoosh mailbox preview in development.
  #
  # Note that preview only shows emails that were sent by the same
  # node running the Phoenix server.
  if Mix.env() == :dev do
    scope "/dev" do
      pipe_through :browser

      forward "/mailbox", Plug.Swoosh.MailboxPreview
    end
  end

  scope "/", Shift73kWeb do
    pipe_through([:browser, :ensure_user_exist])

    get "/", Redirector, to: "/assign"
  end

  scope "/", Shift73kWeb do
    pipe_through [:browser, :redirect_if_user_is_authenticated, :ensure_allow_registration]

    get "/users/register", UserRegistrationController, :new
  end

  scope "/", Shift73kWeb do
    pipe_through [:browser, :redirect_if_user_is_authenticated, :ensure_user_exist]

    # session routes, irrelevant if user is authenticated
    get "/users/log_in", UserSessionController, :new
    post "/users/log_in", UserSessionController, :create
    get "/users/reset_password", UserResetPasswordController, :new
    post "/users/reset_password", UserResetPasswordController, :create
    get "/users/reset_password/:token", UserResetPasswordController, :edit
  end

  scope "/", Shift73kWeb do
    pipe_through [:browser, :require_authenticated_user]

    # user settings (change email, password, calendar week start, etc)
    live "/users/settings", UserLive.Settings, :edit

    # confirm email by token
    get "/users/settings/confirm_email/:token", UserSettingsController, :confirm_email
  end

  scope "/", Shift73kWeb do
    pipe_through [:browser, :ensure_user_exist]

    # session paths
    delete "/users/log_out", UserSessionController, :delete
    get "/users/force_logout", UserSessionController, :force_logout
    get "/users/confirm", UserConfirmationController, :new
    post "/users/confirm", UserConfirmationController, :create
    get "/users/confirm/:token", UserConfirmationController, :confirm

    # ics/ical route for user's shifts
    get "/ics/:slug", UserShiftsIcsController, :index
  end

  scope "/", Shift73kWeb do
    pipe_through [:browser, :require_authenticated_user, :ensure_role_user]

    live "/templates", ShiftTemplateLive.Index, :index
    live "/templates/new", ShiftTemplateLive.Index, :new
    live "/templates/:id/edit", ShiftTemplateLive.Index, :edit
    live "/templates/:id/clone", ShiftTemplateLive.Index, :clone

    live "/assign", ShiftAssignLive.Index, :index

    live "/shifts", ShiftLive.Index, :index

    get "/csv", UserShiftsCsvController, :new
    post "/csv", UserShiftsCsvController, :export

    live "/import", ShiftImportLive.Index, :index
  end

  # scope "/", Shift73kWeb do
  #   pipe_through([:browser, :require_authenticated_user, :ensure_role_admin])
  # end

  # Users Management
  scope "/users", Shift73kWeb do
    pipe_through [:browser, :require_authenticated_user, :ensure_role_manager, :require_email_confirmed]

    live "/", UserManagementLive.Index, :index
    live "/new", UserManagementLive.Index, :new
    live "/edit/:id", UserManagementLive.Index, :edit
    # resources "/", UserManagementController, only: [:new, :create, :edit, :update]
  end
end
