defmodule PhilomenaWeb.Profile.ArtistLinkController do
  use PhilomenaWeb, :controller

  alias Philomena.ArtistLinks.ArtistLink
  alias Philomena.ArtistLinks
  alias Philomena.Users.User
  alias Philomena.Repo
  import Ecto.Query

  plug PhilomenaWeb.FilterBannedUsersPlug when action in [:new, :create]

  plug :load_and_authorize_resource,
    model: ArtistLink,
    only: [:show, :edit, :update],
    preload: [:user, :tag, :contacted_by_user]

  plug PhilomenaWeb.CanaryMapPlug,
    index: :create_links,
    new: :create_links,
    create: :create_links,
    show: :create_links,
    edit: :edit_links,
    update: :edit_links

  plug :load_and_authorize_resource,
    model: User,
    id_field: "slug",
    id_name: "profile_id",
    persisted: true

  def index(conn, _params) do
    user = conn.assigns.current_user

    artist_links =
      ArtistLink
      |> where(user_id: ^user.id)
      |> Repo.all()

    render(conn, "index.html", title: "Artist Links", artist_links: artist_links)
  end

  def new(conn, _params) do
    changeset = ArtistLinks.change_artist_link(%ArtistLink{})
    render(conn, "new.html", title: "New Artist Link", changeset: changeset)
  end

  def create(conn, %{"artist_link" => artist_link_params}) do
    case ArtistLinks.create_artist_link(conn.assigns.user, artist_link_params) do
      {:ok, artist_link} ->
        conn
        |> put_flash(
          :info,
          "Link submitted! Please put '#{artist_link.verification_code}' on your linked webpage now."
        )
        |> redirect(
          to: Routes.profile_artist_link_path(conn, :show, conn.assigns.user, artist_link)
        )

      {:error, %Ecto.Changeset{} = changeset} ->
        render(conn, "new.html", changeset: changeset)
    end
  end

  def show(conn, _params) do
    artist_link = conn.assigns.artist_link
    render(conn, "show.html", title: "Showing Artist Link", artist_link: artist_link)
  end

  def edit(conn, _params) do
    changeset = ArtistLinks.change_artist_link(conn.assigns.artist_link)

    render(conn, "edit.html", title: "Editing Artist Link", changeset: changeset)
  end

  def update(conn, %{"artist_link" => artist_link_params}) do
    case ArtistLinks.update_artist_link(conn.assigns.artist_link, artist_link_params) do
      {:ok, artist_link} ->
        conn
        |> put_flash(:info, "Link successfully updated.")
        |> redirect(
          to: Routes.profile_artist_link_path(conn, :show, conn.assigns.user, artist_link)
        )

      {:error, changeset} ->
        render(conn, "edit.html", changeset: changeset)
    end
  end
end