# Copyright(c) 2015-2024 ACCESS CO., LTD. All rights reserved.

use Croma

defmodule Antikythera.GearApplication.G2g do
  @moduledoc """
  Helper module to define each gear's `G2g` module that contains interface for gear-to-gear communication.
  """

  alias Antikythera.{Conn, Context, G2gRequest, G2gResponse}

  defmacro __using__(_) do
    quote do
      defmodule G2g do
        @gear_name Mix.Project.config()[:app]

        defun send_without_decoding(req :: v[G2gRequest.t()], context :: v[Context.t()]) ::
                G2gResponse.t() do
          AntikytheraCore.Handler.GearAction.G2g.handle(req, context, @gear_name)
        end

        defun send_without_decoding(%Conn{request: web_req, context: context}) :: G2gResponse.t() do
          g2g_req = G2gRequest.from_web_request(web_req)
          __MODULE__.send_without_decoding(g2g_req, context)
        end

        defun send(req :: v[G2gRequest.t()], context :: v[Context.t()]) :: G2gResponse.t() do
          __MODULE__.send_without_decoding(req, context) |> G2gResponse.decode_body()
        end

        defun send(%Conn{request: web_req, context: context}) :: G2gResponse.t() do
          g2g_req = G2gRequest.from_web_request(web_req)
          __MODULE__.send(g2g_req, context)
        end
      end
    end
  end
end
