lib/glific_web/providers/airtel/controllers/message_controller.ex

defmodule GlificWeb.Providers.Airtel.Controllers.MessageController do
  @moduledoc """
  Dedicated controller to handle different types of inbound message from Airtel
  """

  use GlificWeb, :controller

  alias Glific.{
    Communications,
    Providers.Airtel
  }

  @doc false
  @spec handler(Plug.Conn.t(), map(), String.t()) :: Plug.Conn.t()
  def handler(conn, _params, _msg) do
    conn
    |> Plug.Conn.send_resp(200, "")
    |> Plug.Conn.halt()
  end

  @doc """
  Parse text message payload and convert that into Glific message struct
  """
  @spec text(Plug.Conn.t(), map()) :: Plug.Conn.t()
  def text(conn, params) do
    params
    |> Airtel.Message.receive_text()
    |> Map.put(:organization_id, conn.assigns[:organization_id])
    |> Communications.Message.receive_message()

    handler(conn, params, "text handler")
  end

  # @doc """
  # Callback for airtel image type
  # """
  # @spec image(Plug.Conn.t(), map()) :: Plug.Conn.t()
  # def image(conn, params), do: media(conn, params, :image)

  # @doc """
  # Callback for airtel file type
  # """
  # @spec file(Plug.Conn.t(), map()) :: Plug.Conn.t()
  # def file(conn, params), do: media(conn, params, :document)

  # @doc """
  # Callback for airtel audio type
  # """
  # @spec audio(Plug.Conn.t(), map()) :: Plug.Conn.t()
  # def audio(conn, params), do: media(conn, params, :audio)

  # @doc """
  # Callback for airtel video type
  # """
  # @spec video(Plug.Conn.t(), map()) :: Plug.Conn.t()
  # def video(conn, params), do: media(conn, params, :video)

  # @doc """
  # Callback for airtel sticker image
  # """
  # @spec sticker(Plug.Conn.t(), map()) :: Plug.Conn.t()
  # def sticker(conn, params), do: media(conn, params, :sticker)

  # @doc false
  # # Handle Airtel media message and convert them into Glific Message struct
  # @spec media(Plug.Conn.t(), map(), atom()) :: Plug.Conn.t()
  # defp media(conn, params, type) do
  #   params
  #   |> Airtel.Message.receive_media()
  #   |> Map.put(:organization_id, conn.assigns[:organization_id])
  #   |> Communications.Message.receive_message(type)

  #   handler(conn, params, "media handler")
  # end

  @doc """
  Callback for interactive quick reply type
  """
  @spec quick_reply(Plug.Conn.t(), map()) :: Plug.Conn.t()
  def quick_reply(conn, params), do: interactive(conn, params, :quick_reply)

  @doc """
  Callback for interactive list
  """
  @spec list(Plug.Conn.t(), map()) :: Plug.Conn.t()
  def list(conn, params), do: interactive(conn, params, :list)

  @doc false
  # Handle Airtel interactive message and convert them into Glific Message struct
  @spec interactive(Plug.Conn.t(), map(), atom()) :: Plug.Conn.t()
  defp interactive(conn, params, type) do
    params
    |> Airtel.Message.receive_interactive()
    |> Map.put(:organization_id, conn.assigns[:organization_id])
    |> Communications.Message.receive_message(type)

    handler(conn, params, "interactive handler")
  end

  # @doc false
  # # Handle Airtel location message and convert them into Glific Message struct
  # @spec location(Plug.Conn.t(), map()) :: Plug.Conn.t()
  # def location(conn, params) do
  #   params
  #   |> Airtel.Message.receive_location()
  #   |> Map.put(:organization_id, conn.assigns[:organization_id])
  #   |> Communications.Message.receive_message(:location)

  #   handler(conn, params, "location handler")
  # end
end