defmodule BrightWeb.Router do
  use BrightWeb, :router

  import BrightWeb.UserAuth

  import Oban.Web.Router

  pipeline :browser do
    plug(:accepts, ["html", "json"])
    plug(:fetch_session)
    plug(:fetch_live_flash)
    plug(:put_root_layout, html: {BrightWeb.Layouts, :root})
    plug(:protect_from_forgery)
    plug(:put_secure_browser_headers)
    plug(:fetch_current_user)
  end


  pipeline :api do
    plug(:accepts, ["json"])
  end

  # scope "/" do
  #   pipe_through([:browser, :require_auth, :require_admin_user])
  #   ## !!! DANGER, platforms must only be writable by admins, (unless we implement SVG sanitizing)
  #   get("/platforms/new", PlatformController, :new)
  #   post("/platforms", PlatformController, :create)
  #   get("/platforms/:id/edit", PlatformController, :edit)
  #   patch("/platforms/:id", PlatformController, :update)
  #   put("/platforms/:id", PlatformController, :update)
  # end

  scope "/auth", BrightWeb do
    pipe_through(:browser)

    get("/:provider", AuthController, :request)
    get("/:provider/callback", AuthController, :callback)
    post("/:provider/callback", AuthController, :callback)
    delete("/logout", AuthController, :delete)
  end


  # scope "/account", BrightWeb do
  #   pipe_through([:browser, :require_auth])

  #   post("/", AuthController, :create_and_sign_in)
  # end

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

    get("/streams/new", StreamController, :new)
    post("/streams", StreamController, :create)

    # get "/vods/new", VodController, :new
    # post "/vods", VodController, :create

    # resources "/vt", VtuberController do
    #   get "/vods/new", VodController, :new
    #   post "/vods", VodController, :create
    #   get "/vtubers/:id/edit", VtuberController, :edit
    # end

    # resources "/vtubers", VtuberController do
    #   get "/vods/new", VodController, :new

    #   post "/vods", VodController, :create
    #   get "/vtubers/:id/edit", VtuberController, :edit
    # end

    get("/tags/new", TagController, :new)
    post("/tags", TagController, :create)
  end

  scope "/", BrightWeb do
    pipe_through(:browser)

    get("/", PageController, :home)


    get("/profile", PageController, :profile)

    get("/patrons", PatronController, :index)
    get("/about", PageController, :about)
    get("/api", PageController, :api)

    get("/join", UserController, :join)
    post("/join", UserController, :join)
    post("/join", UserController, :join)

    resources("/orders", OrderController, only: [:create, :show])

    get("/streams", StreamController, :index)
    get("/streams/:id", StreamController, :show)

    resources("/vods", VodController)
    get("/vods/:id", VodController, :show)
    get("/vods", VodController, :index)

    get("/tags", TagController, :index)
    get("/tags:id", TagController, :show)

    get("/platforms", PlatformController, :index)
    get("/platforms/:id", PlatformController, :show)

    get("/vtubers", VtuberController, :index)
    get("/vtubers/:id", VtuberController, :show)

    resources "/vt", VtuberController do
      get("/vods", VodController, :index)
      get("/vods/:id", VodController, :show)
    end

    oban_dashboard "/oban"

  end

  scope "/feed", BrightWeb do
    get "/vods.xml", RssController, :vods
  end

  # Other scopes may use custom stacks.
  scope "/api", BrightWeb do
    pipe_through(:api)
    resources("/urls", UrlController, except: [:new, :edit])
    get("/health", PageController, :health)
  end

  # Enable LiveDashboard and Swoosh mailbox preview in development
  if Application.compile_env(:bright, :dev_routes) do
    # If you want to use the LiveDashboard in production, you should put
    # it behind authentication and allow only admins to access it.
    # If your application does not have an admins-only section yet,
    # you can use Plug.BasicAuth to set up some basic authentication
    # as long as you are also using SSL (which you should anyway).
    import Phoenix.LiveDashboard.Router

    scope "/dev" do
      pipe_through(:browser)

      live_dashboard("/dashboard", metrics: BrightWeb.Telemetry)
      forward("/mailbox", Plug.Swoosh.MailboxPreview)
    end
  end


end