defmodule BrightWeb.AuthController do
  @moduledoc """
  Auth controller responsible for handling Ueberauth responses
  """

  require Logger
  use BrightWeb, :controller

  plug Ueberauth

  alias Ueberauth.Strategy.Helpers
  alias Bright.UserFromAuth
  alias Bright.User


  def delete(conn, _params) do
    conn
    |> put_flash(:info, "You have been logged out!")
    |> clear_session()
    |> redirect(to: "/")
  end

  def callback(%{assigns: %{ueberauth_failure: _fails}} = conn, _params) do
    conn
    |> put_flash(:error, "Failed to authenticate.")
    |> redirect(to: "/")
  end

  # def callback(conn, %{"provider" => provider}) do
  # end

  def callback(conn = %{assigns: %{ueberauth_auth: auth}}, _params) do
    if user = User.get_by_ueberauth(auth) do
      sign_in_and_redirect(conn, user, ~p"/~")
    else
      conn
      |> put_flash(:success, "Almost there! Please complete your profile now.")
      |> redirect(to: ~p"/join?#{params_from_ueberauth(auth)}")
    end
  end




  defp sign_in_and_redirect(conn, user, route) do
    user
    |> User.sign_in_changes()
    |> Repo.update()

    conn
    |> assign(:current_user, user)
    |> put_flash(:success, "Welcome!")
    |> put_session("id", user.id)
    |> configure_session(renew: true)
    |> redirect(to: route)
  end


  defp params_from_ueberauth(%{provider: :github, info: info}) do
    %{name: info.name, handle: info.nickname, github_handle: info.nickname}
  end

  defp params_from_ueberauth(%{provider: :patreon, info: info}) do
    %{name: info.name, handle: info.nickname, patreon_handle: info.nickname}
  end

    # case Ueberauth.Auth.fetch!(conn) do
    #   {:ok, auth} ->
    #     Logger.info("auth is as follows: #{inspect(auth)}")
    #   {:error, reason} ->
    #     conn
    #     |> put_flash(:error, "Auth failed! #{reason}")
    #     |> redirect(to: ~p"/")
    # end

    # case UserFromAuth.find_or_create(auth) do
    #   {:ok, user} ->
    #     conn
    #     |> put_flash(:info, "Successfully authenticated #{inspect(user)}")
    #     |> put_session(:current_user, user)
    #     |> configure_session(renew: true)
    #     |> redirect(to: "/")

    #   {:error, reason} ->
    #     conn
    #     |> put_flash(:error, reason)
    #     |> redirect(to: "/")
    # end

end