defmodule Pleroma.Web.ApiSpec.TranslationOperation do
  alias OpenApiSpex.Operation
  alias OpenApiSpex.Schema

  @spec open_api_operation(atom) :: Operation.t()
  def open_api_operation(action) do
    operation = String.to_existing_atom("#{action}_operation")
    apply(__MODULE__, operation, [])
  end

  @spec languages_operation() :: Operation.t()
  def languages_operation() do
    %Operation{
      tags: ["Retrieve status translation"],
      summary: "Translate status",
      description: "View the translation of a given status",
      operationId: "AkkomaAPI.TranslationController.languages",
      security: [%{"oAuth" => ["read:statuses"]}],
      responses: %{
        200 =>
          Operation.response("Translation", "application/json", source_dest_languages_schema())
      }
    }
  end

  defp source_dest_languages_schema do
    %Schema{
      type: :object,
      required: [:source, :target],
      properties: %{
        source: languages_schema(),
        target: languages_schema()
      }
    }
  end

  defp languages_schema do
    %Schema{
      type: :array,
      items: %Schema{
        type: :object,
        properties: %{
          code: %Schema{
            type: :string
          },
          name: %Schema{
            type: :string
          }
        }
      }
    }
  end
end
