defmodule GlificWeb.Schema.TemplateTagTypes do
  @moduledoc """
  GraphQL Representation of Glific's Template Tag DataType
  """
  use Absinthe.Schema.Notation
  import Absinthe.Resolution.Helpers, only: [dataloader: 1]
  alias Glific.Repo
  alias GlificWeb.Resolvers
  alias GlificWeb.Schema.Middleware.Authorize
  object :template_tag_result do
    field :template_tag, :template_tag
    field :errors, list_of(:input_error)
  end
  object :template_tag do
    field :id, :id
    field :value, :string
    field :template, :session_template do
      resolve(dataloader(Repo))
    end
    field :tag, :tag do
      resolve(dataloader(Repo))
    end
  end
  object :template_tags do
    field :number_deleted, :integer
    field :template_tags, list_of(:template_tag)
  end
  input_object :template_tag_input do
    field :template_id, :id
    field :tag_id, :id
  end
  input_object :template_tags_input do
    field :template_id, non_null(:id)
    field :add_tag_ids, non_null(list_of(:id))
    field :delete_tag_ids, non_null(list_of(:id))
  end
  object :template_tag_mutations do
    field :create_template_tag, :template_tag_result do
      arg(:input, non_null(:template_tag_input))
      middleware(Authorize, :staff)
      resolve(&Resolvers.Tags.create_template_tag/3)
    end
    field :update_template_tags, :template_tags do
      arg(:input, non_null(:template_tags_input))
      middleware(Authorize, :staff)
      resolve(&Resolvers.Tags.update_template_tags/3)
    end
  end
end